6

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

4

1 回答 1

8

是的,您可以从 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 > }
于 2019-07-01T02:08:07.453 回答