无论是monadic操作

时间:2013-04-24 14:08:07

标签: scala either

我刚开始习惯于处理monadic操作。 对于Option类型,Tony Morris的备忘单帮助: http://blog.tmorris.net/posts/scalaoption-cheat-sheet/

所以最后似乎很容易理解:

  • map会转换选项内部的值
  • 展平允许转换Option[Option[X]]
  • 中的Option[X]
  • flatMap以某种方式生成Option[Option[X]]的地图操作,然后展平为Option[X]

至少这是我现在所理解的。


For Either,似乎有点难以理解,因为它本身不是正确的biaised,没有map / flatMap操作......我们使用投影。

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

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

在我看来,如果Either是正确的biaised,那么Either.flatten将是Either.joinRight no?

在这个问题中:Either, Options and for comprehensions我要求了解对Eiher的理解,其中一个答案说我们不能混合monad,因为它被涂在map / flatMap / filter中。

使用这种代码时:

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]它将无法正常工作?


修改 尝试[Something]与右边的[Throwable,Something]完全相同吗?

1 个答案:

答案 0 :(得分:3)

Either从来就不是一个基于异常处理的结构。它的意思是表示一个函数真的可以返回两种不同类型之一的情况,但是人们开始了这样的约定,其中左类型应该是失败的情况而权利是成功的。如果要为某些通过/失败类型业务检查逻辑返回偏向类型,则Validation中的scalaz运行良好。如果您的函数可以返回值或Throwable,那么Try将是一个不错的选择。 Either应该用于你真正可能获得两种可能类型之一的情况,现在我正在使用TryValidation(每种情况适用于不同类型的情况),我从不使用Either了。