斯卡拉类型推理与_架的地方
-
28-09-2019 - |
题
List("This","is","Scala").foreach(a => print(a+" "))
编译好,但是
List("This","is","Scala").foreach(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
哪里 A
是的类型参数 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+" "
必须的类型 Any
, ,这当然意味着它可以是任何东西。它不会帮助编译器在维护什么类型的 a
是。这并不真正的问题,因为你不想打印 Function
在第一位。
其他提示
斯卡拉读 (_+" ")
作为 x => x+" "
.但 println
不包含任何类型的信息,以帮助编译器猜猜是什么类型的 x
可能,所以它提供了这一错误。
你想要什么它要做的就是注意到 println
没有工作和recurse后再试一次为 foreach
.但它不能这样做: println
可以采取任何论据,包括一个功能,所以 x => x+" "
是一个完全有效的事情 println
试试打印。
(甚至在一个情况下它可能在理论上走回头路,它一般不会.)
不隶属于 StackOverflow