高阶函数不会解析任何参数

时间:2014-09-12 00:35:38

标签: scala functional-programming higher-order-functions

为什么这是非法的:

def foobar() = {}

val option: Option[() => Unit] = Some(foobar)

这是合法的:

def foobar() = {}

val intermediate: () => Unit = foobar

val option: Option[() => Unit] = Some(intermediate)

在第一个示例中,编译器抱怨分配的右侧是Option[Unit]类型而不是Option[() => Unit]

我怀疑这与评估foobar有关,而不是作为变量传递给Some(),但我不确定。

1 个答案:

答案 0 :(得分:12)

这是因为在评估empty-parens方法时括号是可选的。按照惯例,他们不使用纯粹的方法,但这只是惯例。所以你是对的,它实际上是评估foobar而不是eta-将它扩展为一个函数。您可以通过使用下划线运算符显式调用eta扩展来修复第一个示例:

val option: Option[() => Unit] = Some(foobar _)