在这个问题中Invoking function which accept functions as parameters这也是对代码无法编译的原因的有效解释吗?
funParam(3)是一个有效的调用,但有趣(funParam(3))不是。在编译之前不会评估funParam(3),因此编译器不能将其作为有效参数接受。
我认为我很困惑,因为将参数传递给编译前的函数是常见的做法,但是将包含参数的函数传递给函数预编译是无效的吗?
答案 0 :(得分:1)
原因是因为fun
期望Int => Int
作为参数,但funParam(3)
不属于该类型。它的类型是Int
。
答案 1 :(得分:1)
给出
def funParam(i: Int): Int = ...
您可以将方法funParam
视为类型为Int => Int
但funParam(3)
不是函数,它是具体的值 - Int
,因此不是Int => Int
因此,您无法将Int
传递给期望Int => Int
的方法。
答案 2 :(得分:1)
我认为你可能会混淆几个概念。
值得考虑为什么一个函数可能会将另一个函数作为参数。给定fun: (Int => Int) => Int
(将Int => Int
函数作为参数并返回Int
的函数),假设fun
计划将Int
传递给map
它的参数,并返回一些修改后的结果版本。这种模式在函数式编程中经常使用,比如我们将函数传递给对集合内部的值进行操作的reduce
或Int => Int
。类型fun
到fun
的参数本质上是一个带有"孔的计算"在其中,它依靠Int
或其他一些操作来提供funParam(3)
,需要对其进行全面评估。
funParam(3)
没有任何未指定的变量,只要它被引用就会立即进行评估。这就是Int
的类型为funParam
的原因。当然,Int => Int
本身就是Int
,但由于您已经给它3
参数Int
,因此整个表达式的类型只是返回类型:{ {1}}。