【发布时间】:2017-01-03 00:14:43
【问题描述】:
我正在学习 Scala 中的函数式编程(作者:Paul Chiusano 和 Runar Bjarnarson),在下面找到了关于不使用以下总函数进行异常处理的解释。它说如果我们正在做一个我们不应该使用的更大的计算,它到底是什么意思。请你解释一个简单的例子。谢谢!!
【问题讨论】:
标签: scala functional-programming
我正在学习 Scala 中的函数式编程(作者:Paul Chiusano 和 Runar Bjarnarson),在下面找到了关于不使用以下总函数进行异常处理的解释。它说如果我们正在做一个我们不应该使用的更大的计算,它到底是什么意思。请你解释一个简单的例子。谢谢!!
【问题讨论】:
标签: scala functional-programming
让一个名为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 值来检查未定义的情况。
【讨论】:
else list.sum / list.length 是else Some(list.sum / list.length) 吗?
想象一下你的程序可以收到一个列表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] 或者......它不再可能犯这样的错误。
【讨论】: