如何在 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
.
中使用它
所以我有一个简单的数据结构,其中包含一些 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
.