Scala - foldLeft类型推断失败

时间:2012-10-28 11:46:45

标签: scala types fold

在我的代码中,我有以下内容:

  type Occurrences = List[(Char, Int)]

  def subtract(x: Occurrences, y: Occurrences): Occurrences = {
    val yMap = y.toMap
    x foldLeft (List[(Char, Int)]()) {  // ERROR
        case (a: List[(Char, Int)], xe: (Char, Int)) =>
        if(yMap.contains(xe._1)) (xe._1 -> (xe._2 - yMap(xe._1))) :: a
        else a
    }
  }

它在编译时失败,在代码中错误标记之前的{处。错误消息如下:

  

扩展函数缺少参数类型。的参数类型   匿名函数必须完全知道。 (SLS 8.5)预期类型是:   INT

1)怎么会这样?据我所知,这里没有错误解释类型信息的余地,我在互联网上发现了很多这样的例子。我该如何解决这个问题?

2)为什么它认为期望的类型毕竟是Int

1 个答案:

答案 0 :(得分:8)

发生错误的原因是您撰写了xs foldLeft (init) (f)而不是(xs foldLeft init)(f)xs.foldLeft(init)(f)

前者不起作用,因为Scalas运算符符号规则只允许在obj method param形式的调用中留下点和圆括号,而foldLeft不是这种情况,因为它有两个参数列表。