gpt4 book ai didi

scala - 如何从多个 Future[\/[Throwable, T]] 中获取 Future[\/[Throwable, T]]

转载 作者:行者123 更新时间:2023-12-01 10:35:48 26 4
gpt4 key购买 nike

假设我有几种方法可以返回 \/[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 来像现在一样直接使用addmultiply,然后调用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com