Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Haskell';什么是BSON模块?_Haskell_Bson - Fatal编程技术网

如何使用Haskell';什么是BSON模块?

如何使用Haskell';什么是BSON模块?,haskell,bson,Haskell,Bson,我正在挖掘一组Data.BSON.Document结构,将每个结构转换为用户数据结构(我定义了用户)。解包的功能非常简单: docToUser :: Document -> Either String User docToUser u = do name <- look "name" u >>= \(String t) -> return $ unpack t email <- look "email" u >>= \(String

我正在挖掘一组Data.BSON.Document结构,将每个结构转换为用户数据结构(我定义了用户)。解包的功能非常简单:

docToUser :: Document -> Either String User
docToUser u = do
    name <- look "name" u >>= \(String t) -> return $ unpack t
    email <- look "email" u >>= \(String t) -> return $ unpack t
    token <- look "auth" u >>= \(String t) -> return $ unpack t
    Right $ User name email token

因此,第一次运行将返回一个包装在
右侧
构造函数中的用户。第二个是我期望的,比如
Left“fieldnotfound”
,但是得到了一个完全异常。为什么会发生这种情况而不是存储在任何一个数据结构中的错误?

look
通过monadic
fail
原语指示“未找到”。您的返回类型为
这一事实与此无关。无法在
do
表达式中处理此故障;你必须这样写:

unpackUser u = case (look "name" u, look "email" u, look "auth") of
    (Just (String name), Just (String email), Just (String token)) -> Right $ User (unpack name) (unpack email) (unpack token)
    _ -> Left $ "Missing required fields"

look
通过一元
fail
原语表示“未找到”。您的返回类型为
这一事实与此无关。无法在
do
表达式中处理此故障;你必须这样写:

unpackUser u = case (look "name" u, look "email" u, look "auth") of
    (Just (String name), Just (String email), Just (String token)) -> Right $ User (unpack name) (unpack email) (unpack token)
    _ -> Left $ "Missing required fields"

如果要在
上下文中查看
,请执行以下操作:

docToUser = do
    String name <- look "name" u
    String email <- look "email" u
    String token <- look "token" u
    return $ User (unpack name) (unpack email) (unpack token)
docToUser=do

字符串名称如果要在
上下文中查看
,请执行以下操作:

docToUser = do
    String name <- look "name" u
    String email <- look "email" u
    String token <- look "token" u
    return $ User (unpack name) (unpack email) (unpack token)
docToUser=do

字符串名称基于我可以从中找到的信息,以及谷歌搜索的一般信息。。。任何一个monad的实例都没有
fail
实现。我猜,这就是为什么我会得到一个异常而不是左。我写了这个小测试来证明:

eitherMonad :: String -> Either String String
eitherMonad val = do
    if val == "abcd"
        then fail "val is abcd"
        else return "val is something else"

*DB> eitherMonad "abcd"
*** Exception: val is abcd
*DB> eitherMonad "efgh"
Right "val is something else"
另一方面,
fail::String->Maybe String
实际上没有返回任何内容。我的博士生转换的正确方法似乎与此更为相似:

docToUser :: Document -> Either String User
docToUser u = do
    let name  = look "name" u :: Maybe Value
    let email = look "email" u :: Maybe Value
    let token = look "auth" u :: Maybe Value
    case (name, email, token) of
        (Just (String n), Just (String e), Just (String t)) -> Right $ User (unpack n) (unpack e) (unpack t)
        (Nothing, _, _) -> Left "username not found"
        (Just (String n), Nothing, _) -> Left "email not found"
        (Just (String n), Just (String e), Nothing) -> Left "auth token not found"
        otherwise -> Left "Something else broke"
我想这需要相当多的改进,特别是在检测和报告哪些字段失败时。但是,这似乎与答案非常接近


考虑到这一点,我认为这个问题是基于我可以从中找到的信息和其他谷歌搜索的一般信息的重复。。。任何一个monad的实例都没有
fail
实现。我猜,这就是为什么我会得到一个异常而不是左。我写了这个小测试来证明:

eitherMonad :: String -> Either String String
eitherMonad val = do
    if val == "abcd"
        then fail "val is abcd"
        else return "val is something else"

*DB> eitherMonad "abcd"
*** Exception: val is abcd
*DB> eitherMonad "efgh"
Right "val is something else"
另一方面,
fail::String->Maybe String
实际上没有返回任何内容。我的博士生转换的正确方法似乎与此更为相似:

docToUser :: Document -> Either String User
docToUser u = do
    let name  = look "name" u :: Maybe Value
    let email = look "email" u :: Maybe Value
    let token = look "auth" u :: Maybe Value
    case (name, email, token) of
        (Just (String n), Just (String e), Just (String t)) -> Right $ User (unpack n) (unpack e) (unpack t)
        (Nothing, _, _) -> Left "username not found"
        (Just (String n), Nothing, _) -> Left "email not found"
        (Just (String n), Just (String e), Nothing) -> Left "auth token not found"
        otherwise -> Left "Something else broke"
我想这需要相当多的改进,特别是在检测和报告哪些字段失败时。但是,这似乎与答案非常接近


我认为,考虑到这一点,这个问题是重复的,输出是由调用
error
引起的,这与IO中的
fail
相同,但在任意一个单子中都是
fail=Left
。这与此无关。哪个monad
look
unpacuser
使用
无关。在我的示例中,
look
使用
Maybe
。它也可以使用
other
。问题中的解包显式地位于other monad中,因此
fail
ure应该发生在其中,即左侧而不是异常。呃……解包是什么意思<问题中的code>t
UString
,它是
CompactString UTF8
,而
unpack
将其转换为
String
。我将
unpacuser
重命名为
docToUser
,因为这似乎引起了一些混乱。无论是哪种方式,我都希望所有的
look
操作都发生在
other
上下文中,这意味着
fail=Left
。如果它不是在这种情况下发生的,我想知道为什么以及如何改变它,使之发生。我只能在每个字段的查找/解包行中找出某种错误。输出是由调用
error
引起的,这与IO中的
fail
相同,但在任意一个monad中都是
fail=Left
。这与此无关。哪个monad
look
unpacuser
使用
无关。在我的示例中,
look
使用
Maybe
。它也可以使用
other
。问题中的解包显式地位于other monad中,因此
fail
ure应该发生在其中,即左侧而不是异常。呃……解包是什么意思<问题中的code>t
UString
,它是
CompactString UTF8
,而
unpack
将其转换为
String
。我将
unpacuser
重命名为
docToUser
,因为这似乎引起了一些混乱。无论是哪种方式,我都希望所有的
look
操作都发生在
other
上下文中,这意味着
fail=Left
。如果它不是在这种情况下发生的,我想知道为什么以及如何改变它,使之发生。我只能在对每个字段进行查找/解包的行中找出某种错误。请注意,在所有后面的情况下,您不需要将
仅(String..)
行放在后面的情况下,在前面的情况下,
无任何内容将捕获它们,即
情况。。属于(没什么,,->)。。。;(u,没什么,u)->。。。;(u,u,Nothing)->……
工作正常。注意,在所有后面的情况下,您不需要放置
just(String..)
行,在前面的情况下,
Nothing
将捕获它们,即
情况。。属于(没什么,,->)。。。;(u,没什么,u)->。。。;(u,u,没什么)->……
工作正常。