我是Scala的新手。做一些教程,我有错误:
object HelloWorld {
def main(args: Array[String]) = println("Hello Scala!")
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
def product(ds: List[Double]): Double = ds match {
case Nil => 1.0
case Cons(0.0, _) => 0.0
case Cons(x,xs) => x * product(xs)
}
// this call is incorrect
product(List(3.0, 4.0, 4.0, 5.0))
}
此错误的原因是什么?
mismatch; found : List[Double] required: Main.List[Double] product(List(3.0, 4.0, 4.0, 5.0))
List[Double]
是指 Scala 标准库中定义的List
类型。 Main.List[Double]
是指您自己定义的List
类型。
List(3.0, 4.0, 4.0, 5.0)
调用标准库的 List
对象的 apply
方法(因为您没有定义自己的List
对象(,该方法返回标准库List
类型的实例,而不是您的实例。
这个:
List(3.0, 4.0, 4.0, 5.0)
定义双精度的标准 Scala List
(通过配套apply()
方法(,而您的产品方法需要 List
对象的实例(如上所述(。所以你应该提供一个你自己的实例(例如,通过你的Cons
案例类?
一些详细信息
def product(ds: sealed trait List[A+] extends Object ): Double = ds match {
case Nil => 1.0
case Cons(A, _) => A
case Cons(head: A, tail: List[A]) => head * product(tail)
}
product(List(3.0, 4.0, 4.0, 5.0))
此调用不正确,因为输入实现所需的方法product
的List
不scala.collection.immutable.List