【发布时间】:2014-05-22 13:52:08
【问题描述】:
我一直在查看很多 Scala monad 转换器示例,但无法弄清楚如何做我认为可能很简单的事情。我想写一个for 理解,它在数据库(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 之类的东西集成到其中。我正在寻找的是一个工作代码 sn-p,而不仅仅是在 Scalaz 中尝试\/ 的建议。我试图理解 Scalaz,但它的文档很少,而且似乎几乎没有什么是为了解 lambda 演算的人编写的,而我不知道。
【问题讨论】:
-
不知道你是否知道,但 Scala 2.10 有 Try monad 来处理成功和失败:scala-lang.org/api/current/#scala.util.Try
-
因为你处理的是同一个 monad (Option) Monad 转换器不是你要找的,Monad 转换器是用来组成不同类型的 monad (例如 List[Option], Future[Try]等)
-
@GClaramunt 啊,好的。我假设我需要一个 Option monad 加上一个 Either monad,因此需要一个 monad 转换器。感谢您澄清这一点。
标签: mongodb scala monads scalaz monad-transformers