2013-04-24 45 views
2

我刚开始用来处理monadic操作。 的选项类型,托尼·莫里斯的这种小抄帮助: http://blog.tmorris.net/posts/scalaoption-cheat-sheet/单向操作

那么到底它似乎很容易理解:

  • 地图转换选项
  • 压扁许可证内的值在Option[X]
  • flatMap转化Option[Option[X]]是某种产生Option[Option[X]]地图操作,然后变平以Option[X]

至少这是我的理解,直到现在。


对于任何一个,似乎有点困难,以理解,因为要么本身是不对的biaised,没有地图/ flatMap操作......我们使用投影。

我可以阅读Scaladoc,但它不像选项上的备忘单那样清晰。 有人可以提供一张Either Sheet Cheat来描述基本的monadic操作吗?

在我看来,Either.joinRight有点像RightProjection.flatMap,似乎相当于Option.flatten为任一。

在我看来,如果Either是正确的偏向,那么Either.flatten将是Either.joinRight不?

在这个问题:Either, Options and for comprehensions我问Eiher的理解,其中一个答案说,我们不能混合monad,因为它被desugared到地图/ flatMap /过滤器的方式。

当使用这种代码:

def updateUserStats(user: User): Either[Error,User] = for { 
    stampleCount <- stampleRepository.getStampleCount(user).right 
    userUpdated <- Right(copyUserWithStats(user,stampleCount)).right 
    userSaved <- userService.update(userUpdated).right 
} yield userSaved 

这是否意味着所有我的3个方法调用必须总是返回Either[Error,Something]? 我的意思是如果我有一个方法调用Either[Throwable,Something]它不会正常工作?


编辑: 就是尽量[某件事]完全一样的权利,无论是biaised [Throwable的,东西]?

+1

如果你想要一个右倾的'Either',我会建议使用'scalaz。\ /'代替。 – 2013-04-24 14:16:57

+0

没错。但是我不是'\ /'语法的粉丝。看来我也可以使用这个技巧来拉皮或者类型:https://issues.scala-lang.org/browse/SI-5793?focusedCommentId=57583&page=com.atlassian.jira.plugin.system.issuetabpanels%3acomment- tabpanel#comment-57583 – 2013-04-24 14:30:42

+0

您也可以简单地使用'Try',它是scala 2.10库的一部分,并且是正确的。虽然它不是一般的,因为它也将左类型修正为“Throwable”,但这大概是你大多数时候想要的。 – 2013-04-24 14:33:23

回答

3

Either从来没有真正意味着是一个基于异常处理的结构。它的意思是代表一种情况,一种功能真的有可能返回两种截然不同的类型之一,但是人们开始了这样的惯例,即左边的类型应该是失败的情况,右边的是成功的。如果您想为某些通过/失败类型的业务检查逻辑返回偏见类型,那么Validationscalaz起作用很好。如果你有一个函数可以返回一个值或一个Throwable,那么Try将是一个不错的选择。 Either应该用于确实可能会出现两种可能类型之一的情况,现在我正在使用TryValidation(每种情况都适用于不同类型的情况),我从不再使用Either