有没有办法从 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 > }
我正在尝试使用 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 > }