【问题标题】:scala type inference with _ place holder使用 _ 占位符的 scala 类型推断
【发布时间】:2011-03-30 10:03:47
【问题描述】:
List("This","is","Scala").foreach(a => print(a+" "))

编译正常,但是

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

未能抱怨缺少参数类型。我不知道为什么会失败。

编辑:我的意思是 print 不是 println - 并不是说​​它有逻辑上的区别。

【问题讨论】:

标签: scala type-inference placeholder


【解决方案1】:

Scala 将(_+" ") 读作x => x+" "。但是println 不包含任何类型信息来帮助编译器猜测x 可能是什么类型,所以它给出了那个错误。

您想要它做的是注意到println 不起作用并向后递归并再次尝试foreach。但它不能这样做:println 可以接受任何参数,包括函数,所以 x => x+" "println 尝试打印的完全有效的东西。

(即使在理论上可以回溯的情况下,它通常也不会。)

【讨论】:

    【解决方案2】:

    问题是这样的

    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
    

    其中AList 本身的类型参数。由于我们有一个List[String],编译器知道必须将一个Function[String, B] 传递给foreach

    a => print(a+" ") 中,a 的类型是已知的:String

    print(a => a+" ") 中存在问题,因为print 不是Function。但是,编译器还没有考虑到这一点——它仍在尝试编译a => a+" "。那么我们来看看Predef.print的类型:

    def print (x: Any) : Unit
    

    所以a => a+" " 必须是Any 类型,这当然意味着它可以是任何东西。它无助于编译器断言a 的类型是什么。这并不重要,因为您首先不想打印Function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多