我是Scala高阶函数的新手,我对此感到困惑。 据我所知,HOF可以将函数作为
之类的参数val c = (x:Int)=> x + 3
这里意味着它采用Int类型的一个参数并返回Int。
但是我无法理解下面的代码,因为它将函数作为Int =>类型的参数。 Int但意味着它接受一个参数并返回Int,但在实现它时,它们发送一个带有两个Int args的函数。
def calculate(f: Int => Int, a: Int, b: Int) =
if (b != 0) f(a, b) else throw Exception("Divide by 0")
def divide(a: Int, b: Int) = a / b
calculate(divide, 2, 0) // => Exception
calculate(divide, 4, 2) // => 2
有人可以帮助我理解这一点。 我很感激,如果有人可以分享一些代码链接,我可以更多地了解HOF。
答案 0 :(得分:1)
def divide(a: Int, b: Int): Int = a / b
divide
是一个函数(实际上是一种方法),需要2 Int
s并返回1 Int
。它也可以这样写。
val divide = (a:Int, b:Int) => a/b
在这种情况下,它是一个实际的函数,但方法和函数之间的区别不需要在这里关注。
def calculate(f: (Int, Int) => Int, a: Int, b: Int): Int = ...
calculate
采取3个论点。第一个f
是一个函数,它需要2 Int
s并返回1 Int
。 (注意正确的签名。)
calculate(divide, 77, 7)
以calculate
作为第一个参数调用divide
。 calculate
代码divide
内部被引用(重命名)为f
并被调用。所以f(a, b)
确实是divide(77, 7)
。