質問

私はあなたが関数としてそれを使用する方法の後_を必要とするときになどのルールに少し不安定です。たとえば、なぜ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