1

これは機能します:(1 to 5).reduceLeft( _+_ )

しかし、これはしません:(x:Int,y:Int)=>_+_

<console>:8: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
              (x:Int,y:Int)=>_+_
                             ^
<console>:8: error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))
              (x:Int,y:Int)=>_+_
                               ^

最初のケースでは無名関数 ( _+_) が正常にコンパイルされましたが、2 番目のケースでは失敗したため、一貫性がありません。

私が見逃したものや間違っているものはありますか?それとも単なる構文定義ですか?

4

1 に答える 1

9

矛盾はありません。最初のケースでは、追加される 2 つの引数を持つ無名関数を作成しています。つまり、次のようなものです。

(1 to 5).reduceLeft((x, y) => x + y)

ただし、2 番目のケースでは、2 つの引数を持つ別の無名関数を返す無名関数を作成しています。

(x: Int, y: Int) => ((a, b) => a + b)

(x: Int, y: Int) => _+_(あなたは と同じだと思っていたようですが(x: Int, y: Int) => x + y、そうではありません。)

最初のケース_ + _では、引数の型が (のパラメータとしてreduceLeft) わかっているコンテキストで使用しました。2番目のケースでは、内部関数のパラメーターの型を推測できないコンテキストで使用しているようです。それがまさにあなたのエラーです。

于 2014-05-25T06:57:22.723 に答える