gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:00:54 25 4
gpt4 key购买 nike

我一直在查看大量 Scala monad 转换器示例,但一直无法弄清楚如何做我认为可能很简单的事情。我想写一个 for comprehension 来查找数据库 (MongoDB) 中的内容,它返回一个 Option,然后如果那个 Option 是一个Some,查看其内容并获取另一个Option,依此类推。在每一步,如果我得到一个 None,我想中止整个过程并生成一条错误消息,如 “X not found”for 理解应该产生一个 Either(或类似的东西),其中 Left 包含错误消息和 Right 包含整个操作的成功结果(可能只是一个字符串,或者可能是使用沿途获得的几个值构造的对象)。

到目前为止,我一直在单独使用 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

基本上是一个 Option to Try 转换,捕获异常中的错误。 Try 是一个专门的右偏 Either,它是一元的(与 Either 相反,后者不是)

关于mongodb - Scala 中的 Monad 转换器,用于理解处理选项和收集错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23808848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com