如何在 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)
到目前为止我尝试了什么
- selectFields,但我不知道如何将表达式 (Q Exp) 更改为文档
- 正在执行 deriveBson,但我遇到了与文档中的示例相同的错误
请注意,我对 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)
如果您想手动跳过实施 - 您需要向我展示错误,我很乐意帮助您解决问题。
我一直在尝试了解如何使用 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)
到目前为止我尝试了什么
- selectFields,但我不知道如何将表达式 (Q Exp) 更改为文档
- 正在执行 deriveBson,但我遇到了与文档中的示例相同的错误
请注意,我对 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 _
.
使用
进行测试toBson ["no-content":=Int64 1, "checked":= Bool True] :: Maybe (Item Int)
toBson ["content":=Int64 1, "unchecked":= Bool True] :: Either String (Item Int)
如果您想手动跳过实施 - 您需要向我展示错误,我很乐意帮助您解决问题。