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)
。
我是一个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)
。