如果我理解正确,您正在使用hackage: mongoDB与数据库交互。
所以,我们要做的唯一事情是一个Haskell值转换为BSON价值这是hackage: bson提供,特别是在类型类Val
class (Typeable a, Show a, Eq a) => Val a where
Haskell types of this class correspond to BSON value types
Minimal complete definition
val, cast'
Methods
val :: a -> Value
...
cast' :: Value -> Maybe a
...
所以它仍然实现val
和cast'
但首先我们需要推导出比您拥有的更多属性:
Body.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE OverloadedStrings #-}
module Body where
import Data.Bson
import Data.Typeable
data Body = Body { bodyID :: Int
, brandID :: Int }
deriving (Show,Typeable,Eq)
instance Val Body where
val (Body body brand) = Doc [ "bodyID" := (Int64 $ fromIntegral body)
, "brandID" := (Int64 $ fromIntegral brand)]
cast' (Doc bson) = case (bson !? "bodyID") of
Just (Int64 x) ->
case (bson !? "brandID") of
Just (Int64 y) -> Just (Body (fromIntegral x)
(fromIntegral y))
Just _ -> Nothing
Nothing -> Nothing
Just _ -> Nothing
Nothing -> Nothing
cast' (Array x) = undefined
cast' _ = Nothing
这是一个有点集群而是简单。
下面我就给这个东西多一点思考 - 以前cast'
真的集群和Haskell有很好的抽象应该做的更好
val (Body body brand) = Doc [ "bodyID" := (val body)
, "brandID" := (val brand)]
cast' (Doc bson) = do body <- (bson !? "bodyID")
brand <- (bson !? "brandID")
Body <$> cast' body <*> cast' brand
cast' _ = Nothing
所以,你真的可以写这个有点短接受这样<$>
(叫做fmap
)和<*>
(叫做ap
做“正确”的事
另外我用do
符号来简化FY工作,现在用这个
> cast' $ val (Body 30 4) :: Maybe Body
Just (Body {bodyID = 30, brandID = 4})
注在你真正需要的注释:: Maybe Body
最后一个例子,否则编译器无法弄清楚投什么,你会得到一个Nothing
。
为什么你的意思是“对于mongodb”?你想转换为json吗?如果是,那就是aeson包。更多信息可以帮助。 – sinelaw
@sinelaw Database.MongoDB的字段语法如上所述。我不知道 ;他们的例子是“access pipe master”dbname“$ insert”collection“[”author“=:”Mike“]'。所以我想弄清楚如何转换数据类型以适应该字段格式。 – matthias