11

関数を適用するためにドット表記を省略したときに、このコンパイルエラーが次のように表示される理由を誰かが説明できますfoldLeftか?(バージョン2.9.2)

scala> val l = List(1, 2, 3)
res19: List[Int] = List(1 ,2 ,3)

scala> l foldLeft(1)(_ * _)
<console>:9: error: Int(1) does not take parameters
                    l foldLeft(1)(_ * _)
                                    ^

しかし

scala> l.foldLeft(1)(_ * _) 
res27: Int = 6

mapこれは、ドットを指定するかどうかを気にしないような他の高階関数には当てはまりません。

私はただ呼び出すことができないので、それは結合性のことではないと思いますfoldLeft(1)

4

2 に答える 2

18

foldLeftがカレーされているからです。ドット表記を使用するだけでなく、括弧を追加してこれを修正することもできます。

scala> (l foldLeft 1)(_ * _)
res3: Int = 6

ああ-そして呼び出すことができないというあなたのコメントに関してはfoldLeft(l)、あなたはそうすることができます、しかしあなたはそれをこのように部分的に適用する必要があります:

scala> (l foldLeft 1) _
res3: ((Int, Int) => Int) => Int = <function1>
于 2012-10-15T22:44:35.507 に答える
3

中置記法に対するscalaの構文サポートにより、ドットを省略することができます。これには、次の3つの部分が必要です。

leftOperand operator rightOperand. 

ただしfoldLeft、パラメーターのリストが2つあるため、構文レベルで4つの部分になります。l foldLeft (1) (_ * _)

これは中置記法に適合しないため、エラーになります。

于 2012-10-16T06:42:37.727 に答える