【问题标题】:Exception handling in Scala functional programmingScala 函数式编程中的异常处理
【发布时间】:2017-01-03 00:14:43
【问题描述】:

我正在学习 Scala 中的函数式编程(作者:Paul Chiusano 和 Runar Bjarnarson),在下面找到了关于不使用以下总函数进行异常处理的解释。它说如果我们正在做一个我们不应该使用的更大的计算,它到底是什么意思。请你解释一个简单的例子。谢谢!!

【问题讨论】:

    标签: scala functional-programming


    【解决方案1】:

    使用类型而不是值来传达错误情况

    让一个名为Foo 的程序使用函数mean。不幸的是,我们将一个空的IndexedSeq 作为参数发送给mean 函数。在这种情况下,mean 函数将返回 onEmpty,它是一个 Double。

    因为IndexedSeq 为空时mean 返回一个double,所以调用程序(Foo 程序)无法区分正常情况(列表非空)和未定义情况(列表为空)。

    mean 函数的问题,它在未定义的情况下和列表非空的正常情况下返回Double

    val someList = List.empty[Double]
    
    val meanValue = mean(someList, -1)
    
    if (meanValue == - 1) //undefined case else meanValue
    

    不推荐上述检查函数mean未定义值的方式。

    作者希望使用某种类型来传达未定义的状态。

    我们可以这样做

    def mean(list: List[Double]): Option[Double] = {
      if (list.isEmpty) None
      else Some(list.sum / list.length)
    }
    

    上述mean函数在遇到未定义的情况(列表为空)时将返回None,并且不依赖于返回值的不安全通信。

    Foo 程序可能会在未定义返回时停止计算 mean 函数或 Foo 程序在遇到未定义值时可能会采用不同的分支(当列表为空时由 mean 函数返回的值) .但是Foo 程序必须回复onEmpty 值来检查未定义的情况。

    【讨论】:

    • 是的,我理解使用一种通用的编程方式(即使用选项),不依赖于程序员的输入(比如-1,有人可以给出-5)。不过这种方式也能处理好事情。你是不是想说我们应该使用更通用的编程方式来避免错误。
    • @PriyaranjanSwain 使用类型而不是值来传达错误情况
    • 不应该else list.sum / list.lengthelse Some(list.sum / list.length) 吗?
    • @RobertUdah 是的,已修复
    • @pamu 是的,您的最后一条评论非常有力,让我非常清楚。“使用类型而不是值来传达错误案例”
    【解决方案2】:

    想象一下你的程序可以收到一个列表List(-2.0, 0.0)

    val list = List(-2.0, 0.0)
    val theMean = mean(list, -1.0)
    
    // now I want to handle the error case
    if (theMean == -1.0)
      println("mean can't be computed!") // wrong!
    

    如果mean 不会采用一些愚蠢的默认值,而是会返回一个Option[Double]Either[String,Double] 或者......它不再可能犯这样的错误。

    【讨论】:

    • 是的!现在我很清楚 .pamu 给出了一个与您的示例明显匹配的声明,即“使用类型来传达错误案例而不是值”
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2021-08-18
    • 2020-11-13
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多