我正在研究一组 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
但是,问题在于它实际上似乎并没有在 Either 上下文中出错。以下是一些示例运行:
*DB> docToUser ["name" =: "Savanni", "email" =: "savanni@nowhere.com", "auth" =: "random_token"]
Right (User {name = "Savanni", email = "savanni@nowhere.com", token = "random_token"})
*DB> docToUser ["name" =: "Savanni", "email" =: "savanni@nowhere.com", "a" =: "random_token"]
*** Exception: expected "auth" in [ name: "Savanni", email: "savanni@nowhere.com", a: "random_token"]
因此,第一次运行返回一个包裹在Right
构造函数中的用户。第二个我期待的东西,例如Left "field not found"
,而是得到一个完整的例外。为什么会发生这种情况,而不是存储在 Either 数据结构中的错误?