scala函数声明 - 推理器?

时间:2015-12-21 22:29:29

标签: scala function function-declaration

我是scala noob,通过scala书中的函数式编程学习。我正在做一些练习,这件事让我吃了一惊:

def plusone[Int](l: List[Int]): List[Int] = foldRight(l, Nil:List[Int])((x,xs)=>Cons(x+1,xs))

这是一个创建一个新列表的函数,其中添加了每个元素,但是当我写这个时,我收到了这个错误:

类型不匹配;发现:Int(1)required:String List.scala / exercises / src / main / scala / fpinscala / datastructures line 94 Scala问题

有趣的是,当我从我的函数声明中删除[Int]时(所以只有def plusone,而其他所有人保持不变)我没有任何错误。我不知道如何理解这一点,我很感激你们能给我的任何帮助。

仅供参考,我在那里使用的一些功能:     密封特征列表[+ A]

case object Nil extends List[Nothing]

case class Cons[+A](head: A, tail: List[A]) extends List[A]

def foldRight[A,B](as: List[A], z: B)(f: (A, B) => B): B =
as match {
  case Nil => z
  case Cons(x, xs) => f(x, foldRight(xs, z)(f))
}

我认为所有其他人都应该是通用的。

1 个答案:

答案 0 :(得分:1)

让我们使用您的示例查看语法:

def foldRight[A,B](as: List[A], z: B)(f: (A, B) => B): B = ...

def plusone[Int](l: List[Int]): List[Int] = ...

def plusone(l: List[Int]): List[Int] = ...

你看到了区别吗?想一想。

所以,发生的事情是def xxx[X]意味着使X成为一个类型变量。如果它不起作用,您的列表类型不是List[scala.Int],它是一个列表,其中某些类型未知,在plusone Int的声明中,该阴影{ {1}}。这就是为什么它抱怨scala.Int

这个特定错误的原因在于Predef.any2stringadd隐式转换"增强"使用方法x+1的所有类型。