7
List("This","is","Scala").foreach(a => print(a+" "))

正常にコンパイルされますが、

List("This","is","Scala").foreach(print(_+" "))

パラメータタイプが見つからないという不平を言って失敗します。失敗する理由がわかりませんでした。

編集:私はprintlnではなくprintを意味しました-それが論理的な違いを生むわけではありません。

4

2 に答える 2

7

問題は、これが

List("This","is","Scala").foreach(print(_+" "))

と同等ではありません

List("This","is","Scala").foreach(a => print(a+" "))

しかし

List("This","is","Scala").foreach(print(a => a+" "))

では、 の型シグネチャを見てみましょうforeach:

def foreach [B] (f: (A) ⇒ B) : Unit

whereAは、それ自体の型パラメーターですList。があるのでList[String]、コンパイラは に渡さなければならないことを知ってforeachFunction[String, B]ます。

a => print(a+" ")の型はaすでに知られています: String.

ではなく、print(a => a+" ")に問題があります。ただし、コンパイラはまだそれを考慮していません。まだコンパイルしようとしています。のタイプを見てみましょう:printFunctiona => a+" "Predef.print

def print (x: Any) : Unit

したがってa => a+" "、 type である必要がありますAny。これは、もちろん、何でもかまいません。コンパイラがの型をアサートするのに役立ちませんaFunctionそもそもa を印刷したくなかったので、これはあまり重要ではありません。

于 2010-08-16T16:31:10.037 に答える
6

(_+" ")Scala は次のように読み取りますx => x+" "。ただしprintln、コンパイラが型を推測するのに役立つ型情報が含まれていないxため、そのエラーが発生します。

あなたがやりたかったことは、それが機能しprintlnなかったことに気づき、逆方向に再帰して を再試行することでしforeachた。しかし、それはできません。println関数を含む任意の引数を取ることができるため、印刷を試みるx => x+" "ことは完全に有効です。println

(そして、理論的に後戻りできる場合でも、通常はそうではありません。)

于 2010-08-16T12:54:44.627 に答える