Есть ли способ создать схему dhall из типа данных haskell? - PullRequest
4 голосов
/ 30 июня 2019

Я пытаюсь переписать БОЛЬШОЙ файл конфигурации yaml, используемый в приложении Haksell с использованием dhall. Для этого я использую json-to-dhall, для которого требуется SCHEMA, который является типом результирующего выражения. Проблема в том, что фактическую схему практически невозможно написать вручную, так как она включает в себя множество типов сумм (и вложенных типов сумм). Я попытался сгенерировать схему, преобразовав вручную некоторые части yaml в dhall и запустив dhall type. Это дает схему, которую я могу использовать с jston-to-dhall позже. Это работает для простых типов, но теперь я столкнулся с проблемой союзов (союзов). Dhall нужны аннотации типов для записи файла, который я использую для генерации типа ... Поэтому мне было интересно, есть ли способ (либо с помощью инструмента, либо путем изменения моего приложения на haskell) либо выгрузить данные Haskell в правильный файл dhall, либо по крайней мере, сгенерировать схему из типа Haskell.

1 Ответ

6 голосов
/ 01 июля 2019

Да, вы можете генерировать тип Dhall из типа Haskell.

Вот пример того, как это сделать:

{-# 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)))

... который выводит:

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