我正在学习scala中的currying,并尝试将我的知识应用于以下代码。
object excercise {
def sqrt2(input : Double) : ((Double, Double) => Double, Double) => Double = {
def iter(guessFxn : (Double, Double) => Double, initial : Double) : Double = {
if (isGoodEnough(initial)) initial
else {
val newGuess: Double = guessFxn(initial, input)
iter(guessFxn, newGuess)
}
}
iter
def isGoodEnough(guess: Double): Boolean = {
math.abs(guess * guess - input ) / input < 0.001
}
}
println(sqrt2(2) ( (g: Double, c: Double) => (g + c / g) / 2, 1))
}
我想要实现的是sqrt2应该返回一个带有2个参数的函数
1. fxn(需要2个双精度作为arg并返回双重值)
2. double val
当我试图运行工作表时,它给了我错误
Error: missing arguments for method iter;
follow this method with `_' if you want to treat it as a partially applied function
iter
^
Error: type mismatch;
found : Unit
required: ((Double, Double) => Double, Double) => Double
}
^
Error: missing arguments for method iter;
follow this method with `_' if you want to treat it as a partially applied function
iter
^
答案 0 :(得分:3)
你只需要颠倒那些代码的顺序:
iter
def isGoodEnough(guess: Double): Boolean = {
math.abs(guess * guess - input ) / input < 0.001
}
变为:
def isGoodEnough(guess: Double): Boolean = {
math.abs(guess * guess - input ) / input < 0.001
}
iter
实际上,以内部声明的方法结束涉及返回类型Unit
......这不是你想要的。
此外,你有这个建议:
follow this method with `_' if you want to treat it as a partially applied function
iter
因为如前所述,不返回iter
方法(因为它的调用不是在方法结束时进行的),因此编译器希望它被执行。
当然,要执行,它需要你没有提供的强制参数
所以编译器“认为”你希望部分应用这个功能但是很糟糕。注意部分应用功能与部分功能的概念不同,具有不同的含义......)。
它允许延迟调用,它主要用于处理标准函数(不是curried),我们可能只需要提供第一个参数,然后再提供以下参数。
部分应用功能的示例:
def sum(i: Int, j: Int){...}
调用:
sum 1 _ //just the second parameter needs to be applied later.
sum _ //none parameter is specified, would need to specify both later.
sum 1 2 //complete call, not partially applied so
您可以找到部分应用函数here的良好用例。