gpt4 book ai didi

scala - 为什么 `scala.util.Try` 书 "Handling errors without exceptions"的第 "functional programming in Scala"章中没有提到 0x104567910 ?

转载 作者:行者123 更新时间:2023-12-03 11:47:12 26 4
gpt4 key购买 nike

在“Scala 中的函数式编程”一书的“无异常处理错误”一章中,作者给出:

  • 函数体抛出异常的问题
  • 使用Option如果我们不关心实际的异常
  • 使用Either如果我们关心实际的异常

  • 但是 scala.util.Try没有提到。从我的角度来看,我认为 Try非常适合我们关心实际异常的时候,为什么不提呢?有什么我错过的原因吗?

    最佳答案

    我都不是 Scala 函数式编程的作者,但我可以猜测一下为什么他们没有提到 Try .

    有些人不喜欢标准库的Try因为他们声称it violates the functor composition law .我个人认为这个立场有点愚蠢,因为 Josh Suereth 在 SI-6284 的评论中提到的原因,但辩论确实突出了 Try 的一个重要方面的设计。
    TrymapflatMap被明确设计用于处理可能引发异常的函数。来自 FPiS 学派的人(包括我)倾向于建议将这些函数(如果你绝对必须处理它们)包装在程序中低级别的安全版本中,然后公开一个永远不会抛出的 API (非致命)异常。

    其中Try在你的 API 中混淆了这个模型中的层——你保证你的 API 方法不会抛出异常,但是你给人们一个设计用于抛出异常的函数的类型。

    这只是对Try 标准库的设计和实现的提示。 , 尽管。很容易想象 Try 的版本具有不同的语义,其中 mapflatMap方法没有捕获异常,仍然有充分的理由避免使用 Try 的“改进”版本。只要有可能。

    其中一个原因是使用 Either[MyExceptionType, A]而不是 Try[A]使得从编译器的穷举检查中获得更多的成果成为可能。假设我正在使用以下简单的 ADT 来处理我的应用程序中的错误:

    sealed class FooAppError(message: String) extends Exception(message)

    case class InvalidInput(message: String) extends FooAppError(message)
    case class MissingField(fieldName: String) extends FooAppError(
    s"$fieldName field is missing"
    )

    现在我正在尝试确定只能以这两种方式之一失败的方法是否应该返回 Either[FooAppError, A]Try[A] .选择 Try[A]意味着我们正在丢弃对人类用户和编译器都可能有用的信息。假设我写了一个这样的方法:
    def doSomething(result: Either[FooAppError, String]) = result match {
    case Right(x) => x
    case Left(MissingField(_)) => "bad"
    }

    我会收到一个很好的编译时警告,告诉我匹配并不详尽。如果我为丢失的错误添加案例,警告就会消失。

    如果我使用了 Try[String]相反,我也会进行详尽检查,但摆脱警告的唯一方法是有一个包罗万象的情况——不可能枚举所有 Throwable s 在模式匹配中。

    有时我们实际上不能方便地将操作失败的方式限制为我们自己的失败类型(如上面的 FooAppError),在这些情况下我们总是可以使用 Either[Throwable, A] .斯卡拉兹的 Task ,例如,本质上是 Future[Throwable \/ A] 的包装器。 .区别在于 Either (或 \/ )支持这种签名,而 Try需要它。由于有用的详尽检查等原因,它并不总是您想要的。

    关于scala - 为什么 `scala.util.Try` 书 "Handling errors without exceptions"的第 "functional programming in Scala"章中没有提到 0x104567910 ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31403325/

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