有没有办法从 haskell 数据类型生成 dhall 模式?

Is there a way to generate a dhall schema from an haskell datatype?

我正在尝试使用 dhall 重写 Haksell 应用程序中使用的 BIG yaml 配置文件。 为此,我使用 json-to-dhall,它需要一个 SCHEMA,它是结果表达式的类型。问题是实际的模式几乎不可能手动编写,因为涉及很多求和类型(和嵌套求和类型)。我尝试通过手动将 yaml 的某些部分转换为 dhall 和 运行 dhall type 来生成模式。这提供了一个模式,我可以稍后将其与 jston-to-dhall 一起使用。这适用于简单类型,但现在我面临联合(联合)的问题。 Dhall 需要类型注释来编写我用来生成类型的文件...所以我想知道有没有办法(使用工具或修改我的 haskell 应用程序)转储 Haskell 数据到正确的 dhall 文件或至少从 Haskell 类型生成模式。

是的,您可以从 Haskell 类型生成 Dhall 类型。

以下是如何操作的示例:

{-# LANGUAGE DeriveGeneric    #-}
{-# LANGUAGE DeriveAnyClass   #-}
{-# LANGUAGE TypeApplications #-}

import Data.Either.Validation (Validation(..))
import Data.Text (Text)
import Dhall (FromDhall)
import GHC.Generics (Generic)
import Numeric.Natural (Natural)

import qualified Data.Text.IO as Text.IO
import qualified Dhall
import qualified Dhall.Core

data Mood = Happy | Sad
    deriving (Generic, FromDhall)

data Person = Person { age :: Natural, name :: Text, mood :: Mood }
    deriving (Generic, FromDhall)

main :: IO ()
main = do
    case Dhall.expected (Dhall.auto @Person) of
        Success result -> Text.IO.putStrLn (Dhall.Core.pretty result)
        Failure errors -> print errors

... 输出:

$ runghc ./example.hs
{ age : Natural, name : Text, mood : < Happy | Sad > }