2

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

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

  • map 转换选项内部的值
  • Option[Option[X]]展平许可证以进行改造Option[X]
  • flatMap 在某种程度上是一个地图操作,产生一个Option[Option[X]]然后展平为Option[X]

至少到目前为止我是这么理解的。


对于 Either,它似乎有点难以理解,因为 Either 本身没有正确的偏见,没有 map / flatMap 操作......而且我们使用投影。

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

在我看来,这Either.joinRight有点像RightProjection.flatMap并且似乎相当于Option.flattenfor Either。

在我看来,如果Either是右偏,那么 Either.flatten 将是 Either.joinRight 不?

在这个问题中:我询问关于 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],它就不能正常工作?


编辑: Try[Something] 与右偏的 Either[Throwable,Something] 完全相同吗?

4

1 回答 1

3

Either从来没有真正打算成为一个基于异常处理的结构。它旨在表示一个函数确实可能返回两种不同类型之一的情况,但人们开始约定左侧类型应该是失败的情况,而右侧是成功的情况。如果您想为某些通过/失败类型的业务检查逻辑返回有偏见的类型,那么Validationfromscalaz效果很好。如果您有一个可以返回值或 a 的函数Throwable,那么Try将是一个不错的选择。 Either应该用于您确实可能获得两种可能类型之一的情况,现在我正在使用Tryand Validation(每种情况用于不同类型的情况),我再也不会使用Either了。

于 2013-04-25T00:59:35.193 回答