【问题标题】:Scala - infer type parametersScala - 推断类型参数
【发布时间】:2012-12-13 20:38:21
【问题描述】:

为什么这段代码会产生错误

def test[A](a: List[A], f: A => A) = a.map(f)

println(test(List(1,2,3), _*2))

error: missing parameter type for expanded function ((x$2) => x$2.$times(2))

难道 Scala 不能判断 A 是 Int 吗?

【问题讨论】:

    标签: scala


    【解决方案1】:

    您需要第二个参数列表才能使其工作。我不确定规范中是如何定义的,但是我以前见过。

    scala> def test[A](a: List[A])(f: A => A) = a.map(f)
    test: [A](a: List[A])(f: (A) => A)List[A]
    
    scala> test(List(1))(_+1)
    res1: List[Int] = List(2)
    

    【讨论】:

    • 泛型类型参数的类型推断严格从左到右流动,并且仅从参数列表到参数列表。参数列表中没有统一,也没有反向传播。这是规范中定义的,虽然我太累了,没办法查到哪里。
    【解决方案2】:

    这是示例,如何在不更改任何内容的情况下使其适用于您的情况。

    scala> println(test(List(1,2,3), (i: Int) => i * 2 ))
    

    Scala 的类型推断是有限的,有时你应该帮忙!

    这里是文章Making the most of Scala's (extremely limited) type inference

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      相关资源
      最近更新 更多