12

_关于何时需要使用after 方法将其用作函数的规则,我有点摇摆不定。Foo例如,为什么下面的's 和Nil's有区别::

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>)
4

1 回答 1

15

_ 当您省略部分应用的函数表达式中的所有参数时,除非编译器在您使用它的地方需要函数类型,否则您需要跟随它。

当您调用 on 方法::Foo,编译器需要Int => Int参数的类型。square因此,您可以在该位置之后安全地省略下划线。

但是,::方法 onNil可以采用任何类型的参数。因此,与其假设您打算部分应用该功能,它会抱怨,除非您通过添加_.

所以这些就是规则......我无法真正启发你为什么这些是规则;也许其他对编译器、类型系统和语言设计有更好了解的人将能够告诉你原因。但我认为,如果没有这些规则,在许多地方会有意外模棱两可的危险。

于 2010-01-14T13:17:52.240 回答