缺少参数类型

时间:2016-03-01 10:56:42

标签: scala types

我在Scala中重写了一系列Haskell函数,遇到了一个我似乎无法解释的编译错误

错误如下:

missing parameter type
    def group[A](xs: List[A]): List[List[A]] = groupBy((a, b) => a == b, xs)
                                                        ^
missing parameter type
    def group[A](xs: List[A]): List[List[A]] = groupBy((a, b) => a == b, xs)
                                                           ^

代码如下:

object Stuff {
  def main(args: Array[String]): Unit = {
    val lst = List(1, 1, 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 7)
    println(group(lst))
  }

  def group[A](xs: List[A]): List[List[A]] = groupBy((a, b) => a == b, xs)
  def groupBy[A](fun: (A, A) => Boolean, input: List[A]): List[List[A]] = // stuff
}

我不确定这里发生了什么,为什么它抱怨缺少参数类型。据我所知,一切都已定义

3 个答案:

答案 0 :(得分:6)

如果您在groupBy呼叫站点提供显式泛型类型参数,它将进行编译:

def group[A](xs: List[A]): List[List[A]] = groupBy[A]((a, b) => a == b, xs)

请参阅this post,了解Scala的类型推断在这种情况下失败的原因。

如果您使用curried参数列表编写groupBy,则应正确推断类型信息:

def group[A](xs: List[A]): List[List[A]] = groupBy(xs)((a, b) => a == b)

def groupBy[A](input: List[A])(fun: (A, A) => Boolean): List[List[A]] = input match {
  case Nil => Nil
  case (x::xs) =>
    val (ys, zs) = span(fun.curried(x), xs)
    (x::ys)::groupBy(zs)(fun)
}    

答案 1 :(得分:2)

这似乎是类型推理系统的限制。你可以尝试以下方法:

def group[A](xs: List[A]): List[List[A]] = groupBy((a: A, b: A) => a == b, xs)

答案 2 :(得分:2)

您的函数(a, b) => a == b没有指定其参数的类型。您可以轻松地将其修复为:

def group[A](xs: List[A]): List[List[A]] = groupBy((a: A, b: A) => a == b, xs)

def group[A](xs: List[A]): List[List[A]] = groupBy[A]((a, b) => a == b, xs)

编辑:

另一个答案指出,如果你改变了参数的位置并将它们放在一起,它会起作用。是的,因为那时第二个参数将从第一个参数推断出来。请注意,第二个参数列表可以从第一个参数列表中学习,但如果它们是一个参数列表中的两个参数,那么这是不可能的(它在Scala规范中),这就是我们需要进行干扰的原因。但是,我认为简单地表示类型而不是切换参数和咖喱功能更容易。简单而不必要的并发症。