List("This","is","Scala").foreach(a => print(a+" "))
正常にコンパイルされますが、
List("This","is","Scala").foreach(print(_+" "))
パラメータタイプが見つからないという不平を言って失敗します。失敗する理由がわかりませんでした。
編集:私はprintlnではなくprintを意味しました-それが論理的な違いを生むわけではありません。
List("This","is","Scala").foreach(a => print(a+" "))
正常にコンパイルされますが、
List("This","is","Scala").foreach(print(_+" "))
パラメータタイプが見つからないという不平を言って失敗します。失敗する理由がわかりませんでした。
編集:私はprintlnではなくprintを意味しました-それが論理的な違いを生むわけではありません。
問題は、これが
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]
、コンパイラは に渡さなければならないことを知ってforeach
いFunction[String, B]
ます。
a => print(a+" ")
の型はa
すでに知られています: String
.
ではなく、print(a => a+" ")
に問題があります。ただし、コンパイラはまだそれを考慮していません。まだコンパイルしようとしています。のタイプを見てみましょう:print
Function
a => a+" "
Predef.print
def print (x: Any) : Unit
したがってa => a+" "
、 type である必要がありますAny
。これは、もちろん、何でもかまいません。コンパイラがの型をアサートするのに役立ちませんa
。Function
そもそもa を印刷したくなかったので、これはあまり重要ではありません。
(_+" ")
Scala は次のように読み取りますx => x+" "
。ただしprintln
、コンパイラが型を推測するのに役立つ型情報が含まれていないx
ため、そのエラーが発生します。
あなたがやりたかったことは、それが機能しprintln
なかったことに気づき、逆方向に再帰して を再試行することでしforeach
た。しかし、それはできません。println
関数を含む任意の引数を取ることができるため、印刷を試みるx => x+" "
ことは完全に有効です。println
(そして、理論的に後戻りできる場合でも、通常はそうではありません。)