scala 函数声明 - 推断器?

scala function declaration - Inferencer?

我是一个scala菜鸟,通过scala书中的函数式编程学习。我正在做一些运动,这件事真的吓了我一跳:

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

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

类型不匹配;发现:需要 Int(1):String List.scala /exercises/src/main/scala/fpinscala/datastructures 第 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))
}

我相信所有其他的都应该是通用的。

让我们使用您的示例回顾一下语法:

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,它隐藏了 scala.Int .这就是它抱怨 x+1 的原因。

此特定错误的原因在于 Predef.any2stringadd 隐式转换,即 "augments" 所有类型都带有方法 def +(String)