_ Place Holderを使用したScalaタイプの推論
-
28-09-2019 - |
質問
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
印刷しようとします。
(そして、それが理論的にバックトラックできる場合でも、一般的にはそうではありません。)