mongodb - Scala 中的 Monad 转换器用于理解处理选项并收集错误消息

标签 mongodb scala monads scalaz monad-transformers

我一直在查看很多 Scala monad 转换器示例,但无法弄清楚如何做我认为可能很简单的事情。我想编写一个 for 理解,在数据库(MongoDB)中查找某些内容,它返回一个 Option,那么如果该 OptionSome,查看其内容并获取另一个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/

相关文章:

javascript - MongoDB 检索另一个文档数组中包含的每个文档

mongodb - ObjectID 在官方 mongoDB 驱动程序中自动设置为 "0...0"

xml - 如何防止 Scala 的 XML PrettyPrinter 类删除换行符

python - monad 可以做 OOP 做不到的事情吗?

haskell - 也许单子(monad)用法示例

mongodb - MongoDB中的日期比较

scala - 如何在 Spark 中读取 cassandra 分区时获得良好的性能?

Scala类型约束不允许为空

haskell - 使用随机数加密消息

node.js - Mongoose 文档中的索引