如何使用Haskell';什么是BSON模块?
我正在挖掘一组Data.BSON.Document结构,将每个结构转换为用户数据结构(我定义了用户)。解包的功能非常简单:如何使用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
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
通过monadicfail
原语指示“未找到”。您的返回类型为或这一事实与此无关。无法在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
。这与此无关。哪个monadlook
与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
。这与此无关。哪个monadlook
与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,没什么)->……
工作正常。