作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有几种方法可以返回 \/[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 either 的平面图是右偏的,所以它会基于正确的值进行操作。
但是,如果 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)
最佳答案
您可以将 init
的结果包装在 EitherT
monad 转换器中,使用 flatMapF
而不是 flatMap
来像现在一样直接使用add
和multiply
,然后调用run
得到Future[ErrorOr[Int]]
返回:
EitherT(init(3)).flatMapF(add(_, 4)).flatMapF(multiply(_, 3)).run
关于scala - 如何从多个 Future[\/[Throwable, T]] 中获取 Future[\/[Throwable, T]],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576257/
我是一名优秀的程序员,十分优秀!