gpt4 book ai didi

scala - 为什么猫的效果异步签名使用 Either[Throwable, A] 而不是 Try[A]?

转载 作者:行者123 更新时间:2023-12-03 07:42:57 25 4
gpt4 key购买 nike

很久以前,我们在团队内部就使用 Try[A]Either[Throwable, A] 进行了长时间的辩论,我们最终选择了 Try[ A] 因为当 Either 的左侧是 Throwable 时,它们在语义上是相同的。那次我在寻找一个代码库,其中使用了 Either[Throwable, A] 但我找不到任何东西。

但今天在观看 Fabio Labella 在 How do Fibers Work? A Peek Under the Hood 上的演讲时,以下签名让我印象深刻


def async[A](k: (Either[Throwable, A] => Unit) => Unit): F[A]

所以我的问题是,使用 Either[Throwable, A] 而不是 Try[A] 是否有任何特定原因?推荐哪一个?

最佳答案

我不确定 Try[A]Either[Throwable, A] 之间的语义是否完全同构。例如,我们可以改变 Either

的偏差
val e: Either[Throwable, Int] = Left(new Exception("boom"))
for (s <- e.left) yield s.getMessage.length
res5: scala.util.Either[Int,Int] = Left(4)

或者换边

e.swap
res6: scala.util.Either[Int,Throwable] = Right(java.lang.Exception: boom)

考虑一些不寻常的场景,我们认为 Throwable 实际上是预期的 结果,因此希望它们在右侧 侧。也许我们正在构建一些纯功能测试库,我们希望在其中提供用于断言异常的 API。可以想象将这些语义编码为 Either[A, Throwable]

Either 相对于 Try 的另一个潜在优势可能是 cats 为其提供了更多扩展方法。例如,考虑 import cats.syntax.either._ 中的所有好东西,而我不知道 Try 有类似的东西。假设我们想在一个列表中累积所有错误而不是短路,那么我们可以像这样简单地遍历(_.toValidatedNec)

import cats.syntax.either._
import cats.instances.list._
import cats.syntax.traverse._

val l: List[Either[Throwable, Int]] = List(Right(1), Right(2), Left(new RuntimeException("boom")), Right(3), Left(new RuntimeException("crash")))
l.traverse(_.toValidatedNec)
res0: cats.data.ValidatedNec[Throwable,List[Int]] = Invalid(Chain(java.lang.RuntimeException: boom, java.lang.RuntimeException: crash))

要通过 Try 实现相似,我认为我们必须更加努力。

关于scala - 为什么猫的效果异步签名使用 Either[Throwable, A] 而不是 Try[A]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58103898/

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