如何将值打印/编码到Dhall中?

问题描述

{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

import Dhall

data Example = Example { foo :: Natural,bar :: Vector Double }
    deriving (Generic,Show)

instance Interpret Example

main :: IO ()
main = do
  putStrLn "Hello,Haskell!"
  x <- input auto "./example.dhall"
  print (x :: Example)

在上面的示例中,如何代替将Example编码为dhall值,因此本质上是类型为Example -> String函数?似乎找不到在haddocks中有关打印/编码的任何引用。

解决方法

这是如何漂亮地将Haskell值打印为等效的Dhall表达式:

{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE OverloadedStrings #-}

import Dhall (FromDhall,Natural,ToDhall,Vector)
import Dhall.Pretty (CharacterSet(..))
import GHC.Generics (Generic)

import qualified Data.Text.Prettyprint.Doc.Render.Text as Prettyprint.Text
import qualified Dhall
import qualified Dhall.Pretty
import qualified Dhall.Core

data Example = Example { foo :: Natural,bar :: Vector Double }
    deriving (FromDhall,Generic,Show,ToDhall)

main :: IO ()
main = do
  x <- Dhall.input Dhall.auto "./example.dhall"

  let expression = Dhall.embed Dhall.inject (x :: Example)

  let doc = Dhall.Pretty.prettyCharacterSet Unicode expression

  Prettyprint.Text.putDoc doc