掘り下げている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
ただし、キャッチは、どちらのコンテキストでも実際にはエラーが発生していないように見えることです。実行例を次に示します。
*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
コンストラクター内にラップされたユーザーが返されます。2つ目は、などのようなものを期待してLeft "field not found"
いましたが、代わりに完全な例外が発生します。どちらかのデータ構造内に格納されたエラーの代わりに、これが発生するのはなぜですか?