如何在 Haskell 中为 ByteString 编写 ToDhall 实例?

How can I write a ToDhall instance for a ByteString, in Haskell?

所以我有一个简单的数据结构,其中包含一些 ByteString。我想将这些序列化为 Dhall 文件。但是,我显然不能自动导出 ToDhall,因为没有 ToDhall 的实例。我该怎么写?

data WordBounds = WordBounds { zipFile :: Prelude.FilePath
                             , start :: BS.ByteString
                             , end :: BS.ByteString
                             } deriving (Show, Generic, ToDhall)

我已经尝试了 instance ToDhall BS.ByteString,我想我越来越接近了,但我仍然不太明白 instance 的语法试图做什么,and/or如何让它与 Dhall 一起工作。

根据文档,您似乎可以这样做:

instance ToDhall ByteString where
    injectWith = contramap unpack . injectWith

这使用了 ToDhall 的两个现有实例:

instance ToDhall Word8
instance ToDhall a => ToDhall [a]

...所以方程 RHS 上的 injectWith[Word8],而不是对 ByteString 的递归调用。它还使用

instance Contravariant Encoder

Encoder [Word8] 转换为 Encoder ByteString

也就是说,这将是一个孤立实例。大多数社区会建议您不要这样做。备选方案包括创建 newtype,如

newtype Jonathan'sByteString = Jonathan'sByteString ByteString

并为此编写实例,或者只是编写

jonathan'sInjectWith :: InputNormalizer -> Encoder ByteString
jonathan'sInjectWith = contramap unpack . injectWith

然后在手写 instance ToDhall WordBounds.

中使用它