我一直在查看很多 Scala monad 转换器示例,但无法弄清楚如何做我认为可能很简单的事情。我想编写一个 for
理解,在数据库(MongoDB)中查找某些内容,它返回一个 Option
,那么如果该 Option
是Some
,查看其内容并获取另一个Option
,依此类推。在每一步中,如果我得到 None
,我想中止整个过程并生成一条错误消息,例如 “X not found”
。 for
理解应该产生一个 Either
(或类似的东西),其中 Left
包含错误消息,Right
包含错误消息。 code> 包含整个操作的成功结果(可能只是一个字符串,或者可能是使用沿途获得的几个值构造的对象)。
到目前为止,我只是单独使用 Option
monad,如这个简单的示例所示:
val docContentOpt = for {
doc <- mongoCollection.findOne(MongoDBObject("_id" -> id))
content <- doc.getAs[String]("content")
} yield content
但是,我一直在尝试将 Either
之类的东西集成到其中。我正在寻找的是一个有效的代码片段,而不仅仅是在 Scalaz 中尝试 \/
的建议。我试图理解 Scalaz,但它的文档很少,而且似乎是为那些了解 lambda 演算的人编写的,而我却不懂。
最佳答案
我会“尝试”这样的事情:
def tryOption[T](option: Option[T], message:String ="" ):Try[T] = option match {
case Some(v) => Success(v)
case None => Failure(new Exception(message))
}
val docContentOpt = for {
doc <- tryOption(mongoCollection.findOne(MongoDBObject("_id" -> id)),s"$id not found")
content <- tryOption(doc.getAs[String]("content"), "content not found")
} yield content
基本上是一个尝试转换的选项,用于捕获异常中的错误。 Try
是一种特殊的右偏 Either,它是单子(monad)的(与 Either 不同,后者不是单子(monad)的)
关于mongodb - Scala 中的 Monad 转换器用于理解处理选项并收集错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23808848/