我是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))
}
我认为所有其他人都应该是通用的。
答案 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
的所有类型。