在 Scala 中,List[Double] required: Main.List[Double] 之间有什么区别



我是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))

此调用不正确,因为输入实现所需的方法productListscala.collection.immutable.List

相关内容

  • 没有找到相关文章

最新更新