需要List [Double]之间的差异是什么:Scala中的Main.List [Double]

时间:2017-03-23 12:48:34

标签: scala types mismatch

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

3 个答案:

答案 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