12

_関数としてメソッドを使用するためにメソッドの後に必要な場合について、私はルールが少し不安定です。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>)
4

1 に答える 1

15

部分的に適用された関数式ですべてのパラメーターを省略した場合、使用する場所でコンパイラーが関数型を必要とし_ ない限り、それに続く必要があります。

::でメソッドを呼び出すとFoo、コンパイラはInt => Intパラメーターの型を予期します。squareそのため、その位置の後のアンダースコアを安全に省略できます。

ただし、::メソッド onは任意のNilのパラメーターを取ることができます。したがって、関数を部分的に適用するつもりであると想定するのではなく、 を追加して完全に明示的にしない限り、文句を言います。_

これらがルールです...なぜそれらがルールなのかについて、私はあなたに説明することはできません。おそらく、コンパイラ、型システム、および言語設計についてよりよく知っている他の誰かが、その理由を教えてくれるでしょう。しかし、これらの規則がなければ、多くの場所で偶発的なあいまいさが生じる危険性があると思います。

于 2010-01-14T13:17:52.240 に答える