【发布时间】:2016-02-24 00:11:15
【问题描述】:
假设我有几种方法可以返回\/[Throwable, String]。右边的值Int是我想要的,左边的值会累积错误。
import scalaz._
import Scalaz._
type ErrorOr[T] = \/[Throwable, T]
def init(a: Int): ErrorOr[Int] = a.right
def add(a: Int, b: Int): ErrorOr[Int] = (a + b).right
def multiply(a: Int, b: Int): ErrorOr[Int] = (a * b).right
init(3).flatMap(add(_, 4)).flatMap(multiply(_, 3)) // 21
看起来不错,因为 scalaz any 的平面图是右偏的,所以它会根据正确的值进行操作。
但是,如果要更改 API 调用的方法,则返回类型将为 Future[ErrorOr[T]]。有什么方法可以用来返回Future[ErrorOr[T]]?另外,我可能想使用future.flatMap 作为回调,而不是在这里使用await 来阻止
def init(a: Int): Future[ErrorOr[Int]] = Future(a.right)
def add(a: Int, b: Int): Future[ErrorOr[Int]] = Future((a + b).right)
def multiply(a: Int, b: Int): Future[ErrorOr[Int]] = Future((a * b).right)
【问题讨论】: