質問

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

うまくコンパイルされますが、

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

パラメータータイプが欠落していると不平を言っていません。なぜ失敗するのかわからなかった。

編集:Printlnではなく印刷を意味しました - 論理的な違いを生むということではありません。

役に立ちましたか?

解決

問題はこれです

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

どこ A のタイプパラメーターです List 自体。私たちが持っているので List[String], 、コンパイラは、渡さなければならないことを知っています foreach a Function[String, B].

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

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

def print (x: Any) : Unit

それで a => a+" " タイプのものでなければなりません Any, 、もちろん、それは何でもできることを意味します。コンパイラがタイプのタイプを主張するのに役立ちません a は。あなたが印刷したくなかったので、それは本当に重要ではありません Function まず第一に。

他のヒント

Scalaは読みます (_+" ") なので x => x+" ". 。だが println コンパイラがどのタイプを推測するのに役立つタイプ情報が含まれていません x そうかもしれないので、それはそのエラーを与えます。

あなたが望んでいたのは、それに気づいたことでした println 動作せず、後方に再発して、もう一度試してみてください foreach. 。しかし、それはできません: println 関数を含むあらゆる議論をすることができるので、 x => x+" " 完全に有効なものです println 印刷しようとします。

(そして、それが理論的にバックトラックできる場合でも、一般的にはそうではありません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top