功能评估

时间:2014-12-31 17:52:47

标签: function scala functional-programming

在这个问题中Invoking function which accept functions as parameters这也是对代码无法编译的原因的有效解释吗?

funParam(3)是一个有效的调用,但有趣(funParam(3))不是。在编译之前不会评估funParam(3),因此编译器不能将其作为有效参数接受。

我认为我很困惑,因为将参数传递给编译前的函数是常见的做法,但是将包含参数的函数传递给函数预编译是无效的吗?

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它的参数,并返回一些修改后的结果版本。这种模式在函数式编程中经常使用,比如我们将函数传递给对集合内部的值进行操作的reduceInt => Int。类型funfun的参数本质上是一个带有"孔的计算"在其中,它依靠Int或其他一些操作来提供funParam(3),需要对其进行全面评估。

funParam(3)没有任何未指定的变量,只要它被引用就会立即进行评估。这就是Int的类型为funParam的原因。当然,Int => Int本身就是Int,但由于您已经给它3参数Int,因此整个表达式的类型只是返回类型:{ {1}}。