我是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))
答案 0 :(得分:3)
List[Double]
是指Scala标准库中定义的List
类型。 Main.List[Double]
是指您自己定义的List
类型。
List(3.0, 4.0, 4.0, 5.0)
调用标准库的apply
对象的List
方法(因为您没有定义自己的List
对象) ,它返回标准库List
类型的实例,而不是你的。
答案 1 :(得分:1)
此:
List(3.0, 4.0, 4.0, 5.0)
定义标准Scala List
双打(通过随附apply()
方法),而您的产品方法需要您的 List
对象的实例(以上定义)。所以你应该提供自己的实例(例如通过你的Cons
案例类?)
答案 2 :(得分:0)
以下是一些细节
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