【发布时间】:2019-03-02 16:36:00
【问题描述】:
在尝试了 scala 的 eta 扩展后,我发现了一个奇怪的功能。 让我们定义一个方法:
scala> def sum(a: Int, b: Int): Int = a + b
sum: (a: Int, b: Int)Int
好的,到目前为止,一切都很好。现在让我们使用 eta 扩展将其分配给 val:
scala> val f = sum _
f: (Int, Int) => Int = $$Lambda$1051/694580932@55638165
现在,奇怪的事情来了。我可以再次将 eta 扩展应用于 f,并且它正在工作(但是它在我的方法中添加了柯里化):
scala> val g = f _
g: () => (Int, Int) => Int = $$Lambda$1055/1351568309@5602e540
为什么会这样?我认为 eta 扩展只对方法有效。 此外,我注意到这是不可能的:
scala> ((a: Int, b: Int) => a + b: Int) _
<console>:12: error: _ must follow method; cannot follow (Int, Int) => Int
((a: Int, b: Int) => a + b: Int) _
^
但这与将 eta 扩展应用于 f 不一样吗? 我有点困惑,这些 eta 扩展仍然为我隐藏了一些魔力。 非常感谢!
【问题讨论】: