有没有一种方法可以从haskell数据类型生成dhall模式?

时间:2019-06-30 11:14:22

标签: haskell dhall

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

1 个答案:

答案 0 :(得分:6)

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

以下是操作方法的示例:

function Splitter() {
    if (($(window).width() < 350) || ($('#right-area').width() < 600)) {
        $('.grid-item').css("width", "100%")
    }
    if (($(window).width() < 800) || ($('#right-area').width() < 800)) {
        $('.grid-item').css("width", "50%")
    } else {
        $('.grid-item').css("width", "33.3333%")
    }
}

...输出:

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

import Data.Text (Text)
import Dhall (Interpret)
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, Interpret)

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

main :: IO ()
main = do
    Text.IO.putStrLn (Dhall.Core.pretty (Dhall.expected (Dhall.auto @Person)))