如何在 Haskell 中将一种数据类型转换为 BSON?

How does one transform a data type into BSON in Haskell?

我一直在尝试了解如何使用 Haskell 将数据类型转换为文档,但 Data.Bson.Mapping package, however, I couldn't figure it out and the example in the docs 也无济于事。

我该如何解决这个问题?似乎尚未发布与此相关的任何问题。我将在下面附上相关代码,以便您了解我的来源。

{-# LANGUAGE TemplateHaskell #-}

module Main where
import Database.MongoDB.Connection  (host, connect)
import Database.MongoDB.Query       (access, master, insertMany)
import Data.Data                    (Typeable)
import Data.Bson.Mapping

data Item a = Item { content :: a
                   , checked :: Bool
                   } deriving (Eq, Show, Typeable)

到目前为止我尝试了什么

请注意,我对 Haskell 还是很陌生,我花了 2 个小时寻找解决方案,但就是想不出来。

谢谢。

您说的是错误,但没有 post 错误本身,所以我对此无能为力 - 但序列化您的数据类型应该相当简单

data Item a = Item { content :: a
                   , checked :: Bool
                   } deriving (Eq, Show, Typeable)

instance (Bson a) => Bson (Item a) where
  toBson (Item cont check) = ["content" := Doc (toBson cont)
                             ,"checked" := Bool check]
  fromBson d = do cont  <- "content" `lookup` d
                  check <- "checked" `lookup` d
                  pure $ Item cont check

toBson 必须创建一个 Document,它只是 [Field] 的类型同义词,其中 Field 只是与标记值关联的 Label。当然我们必须要求 a 实现序列化和 de-serialization 才能使 Item 成为 Bson.

的实例

对于 de-serialization 我选择了 lookup 函数,它返回一个单子值,即如果找到该值,如果找不到则失败。例如。如果我们的 monad 是 Maybe 那么如果没有找到它会返回一个 Nothing 并且返回一个 Just x 否则,对于 IO 我们会得到一个 run-time 错误(这是我们想要避免的).所以当调用 toBson ... 时,确保你在像 Maybe _Either String _.

这样的理智的 monad 中执行它

使用

进行测试
toBson ["no-content":=Int64 1, "checked":= Bool True] :: Maybe (Item Int)
toBson ["content":=Int64 1, "unchecked":= Bool True] :: Either String (Item Int)

如果您想手动跳过实施 - 您需要向我展示错误,我很乐意帮助您解决问题。