2012-10-15 16 views
10

私はfoldLeft機能を適用するためのドット表記を省略したときに、私は次のために、このコンパイルエラーを参照してください、なぜ誰もが説明できますか?(バージョン2.9.2)foldLeftにドットを残すと、コンパイルエラーが発生するのはなぜですか?

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 

これは」doesnのmapのように、ドットを供給するかどうかを気にしないような他の高階関数についても当てはまります。

私はちょうどfoldLeft(1)

答えて

17

を呼び出すことはできませんので、私はfoldLeftはカリー化であるためですそのに関連性の事を考えていません。同様にドット表記を使用して、あなたはまた、括弧追加することによってこの問題を解決することができます

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

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

scala> (l foldLeft 1) _ 
res3: ((Int, Int) => Int) => Int = <function1> 
+0

ありがとう、私の質問に対する完全な答えは、パーザがその表現をどのように攻撃するかについてRegisの投稿で行った最初のコメントにあります。 – nsfyn55

3

は、ドットを省略するので、期待してい中置記法のためのScalaの構文のサポート、可能である3部:

leftOperand operator rightOperand. 

しかし理由エラーしたがって、中置記法に適合しないlfoldLeft(1)(_ * _)

:は、パラメータの2つのリストを持っていた、あなたは、構文レベルでの4部で終わります。

+0

それは、中表記法が有用であるときを理解するのに良い経験則かもしれませんが、完全に正確であるかどうかはわかりません。 infix表記法を使って 'foldLeft'を呼び出すことは可能です(前の私の答えに示されています)。問題は、パーサが(l foldLeft(1))の代わりに 'l foldLeft((1)(_ * _))'として 'l fold left(1)(_ * _) ) '。 –

+0

あなたの仕事は実際に私のポイントを証明しています。 foldLeftの部分的な適用を3つの部分にするように強制しています。これにより、挿入表記が可能になります。結果はすぐに呼び出す関数です。 –

+0

申し訳ありません - これは私の部分の踏み台ですが、エラーは、コンパイラによって中断表記が拒否されたためではありません。コンパイラが '(_ * _)'を '(1)'に適用しようとしているからです。 –

関連する問題