Scala中的Monad转换器,用于理解处理Option并收集错误消息

本杰明·吉尔

我一直在查看许多Scala monad变压器示例,但还没有弄清楚如何做我认为很简单的事情。我想编写一种for理解,它在数据库(MongoDB)中查找某个东西,该返回一个Option,然后如果OptionSome,则查看其内容并获取另一个Option,依此类推。在每一步,如果我得到a 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

基本上是“尝试尝试”转换,可捕获异常中的错误。Try是专门的右偏Either,它是单声道的(与Either相反,后者不是)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Scala中的Monad转换器,用于理解处理Option并收集错误消息

来自分类Dev

如何在Scala中实现`List` monad转换器?

来自分类Dev

如何在Scala中实现`List` monad转换器?

来自分类Dev

Scala中XStream的选项转换器

来自分类Dev

Scala中XStream的选项转换器

来自分类Dev

用于DefaultMessageListenerContainer的Spring JMS消息转换器

来自分类Dev

如何收集Either Monad中的所有错误消息?

来自分类Dev

MathJax消息转换器

来自分类Dev

Spring消息转换器

来自分类Dev

是否有用于获取monad转换器版本的库或类型类?

来自分类Dev

将Monad转换器添加到Yesod处理程序堆栈

来自分类Dev

在Spring Cloud Dataflow中激活Avro消息转换器

来自分类Dev

我如何通过monad转换器参数化monad?

来自分类Dev

Jekyll转换器错误

来自分类Dev

将嵌套类型转换为monad转换器堆栈

来自分类Dev

FreeT生成的解释器monad转换器的MonadFix实例?

来自分类Dev

是否有用于通用消息的mongodb映射转换器

来自分类Dev

无法理解Monad的错误处理

来自分类Dev

转换器无法转换错误

来自分类Dev

如何重构使用状态monad转换器的程序?

来自分类Dev

如何为Monad定义隐式转换器?

来自分类Dev

使用monad转换器和标识monad派生基本monad

来自分类Dev

处理由消息驱动的入站通道适配器上的消息转换器引起的异常

来自分类Dev

具有收集字段的Symfony数据转换器

来自分类Dev

如何理解 C++ 中的 MNIST 二进制转换器?

来自分类Dev

Python:Codecademy PygLatin转换器错误

来自分类Dev

Java温度转换器错误

来自分类Dev

nHibernate结果转换器错误

来自分类Dev

numpy.loadtxt,转换器错误