我在的规则,当你需要一个_的方法后,使用它作为一个功能有点不稳。例如,为什么会出现Foo的和Nil在下面::之间的差异?

def square(n: Int) = n * n  
object Foo { def ::(f: Int => Int) = f(42) }

// ...

scala> Foo.::(square)
res2: Int = 1764

scala> Nil.::(square) 
<console>:6: error: missing arguments for method square in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
   Nil.::(square)
          ^
scala> Nil.::(square _) 
res3: List[(Int) => Int] = List(<function1>)
有帮助吗?

解决方案

当省略在部分应用函数表达式的所有的参数,那么就需要用_ 跟随它,除非编译器的需要在使用位置的函数式它

在呼吁::方法Foo,编译器期望该参数的类型Int => Int。所以,你可以放心地忽略在那个位置square后下划线。

然而,在::Nil方法可以采取任何类型的参数。因此,而不是假设你的意思是部分应用功能,它抱怨,除非你让它完全明确加入_

因此,这些都是规则的......我真的不能启发你约的为什么的那些规则;也许别人谁拥有编译器,类型系统和语言设计的更好的知识就能告诉你为什么。但我相信,如果没有这些规则,就不会有意外的模糊性,在许多地方的危险。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top