Scala与一本与特质有关的书的例子

时间:2016-01-24 06:06:53

标签: scala traits

我试图运行上面的例子。但它失败了。有人可以帮忙吗我想我错过了一些非常基本的东西。

 sealed trait List[+A]

    case object Nil extends List[Nothing]
    case class Cons[+A](head: A, tail: List[A]) extends List[A]

    object List {
    def sum(ints: List[Int]): Int = ints match {
    case Nil => 0
    case Cons(x,xs) => x + sum(xs)
    }

    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)
    }

    def apply[A](as: A*): List[A] =
    if (as.isEmpty) Nil
    else Cons(as.head, apply(as.tail: _*))
    }

ERROR

*scala> val x = (1 to 10).toList
x: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)*

*scala> List.sum(x)
<console>:19: error: type mismatch;
 found   : scala.collection.immutable.List[Int]
 required: List(in object $iw)[Int]
       List.sum(x)*
                ^

这是书中的一个例子。我尝试了make List [Int],但仍然是同样的错误。

2 个答案:

答案 0 :(得分:1)

使用您定义的operator+List案例类创建Cons

Nil

答案 1 :(得分:1)

您(和编译器)在您定义的List对象和标准库提供的List之间感到困惑。当它们都具有相同的名称时,很容易犯错误。

toList对象的Range方法(1到10)返回一个库List,但您的代码想要处理自己的List类型,而不是库#&# 39; S

您可以像这样创建正确类型的列表(即您的列表):

val x: List[Int] = List(1,2,3,4)