我刚开始习惯于处理monadic操作。 对于Option类型,Tony Morris的备忘单帮助: http://blog.tmorris.net/posts/scalaoption-cheat-sheet/
所以最后似乎很容易理解:
Option[Option[X]]
Option[X]
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]完全相同吗?
答案 0 :(得分:3)
Either
从来就不是一个基于异常处理的结构。它的意思是表示一个函数真的可以返回两种不同类型之一的情况,但是人们开始了这样的约定,其中左类型应该是失败的情况而权利是成功的。如果要为某些通过/失败类型业务检查逻辑返回偏向类型,则Validation
中的scalaz
运行良好。如果您的函数可以返回值或Throwable
,那么Try
将是一个不错的选择。 Either
应该用于你真正可能获得两种可能类型之一的情况,现在我正在使用Try
和Validation
(每种情况适用于不同类型的情况),我从不使用Either
了。