选项类型' A'没找到

时间:2015-01-27 22:27:05

标签: scala

下面的代码会导致编译错误:

Multiple markers at this line
- not found: type A
- not found: type A

在第def headOption行:

object LazyList {
  println("Welcome to the Scala worksheet")

  sealed trait Stream[+A]
  case object Empty extends Stream[Nothing]
  case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]

  object Stream {

    def cons[A](hd: => A, tl: => Stream[A]): Stream[A] = {
      lazy val head = hd
      lazy val tail = tl
      Cons(() => head, () => tail)
    }

    def empty[A]: Stream[A] = Empty

    def apply[A](as: A*): Stream[A] =
      if (as.isEmpty) empty else cons(as.head, apply(as.tail: _*))

    def headOption : Option[A] = this match {
      case Empty => None
      case Cons(h, t) => Some(h())
    }

  }


}

但我觉得这个功能定义正确吗?由于A是泛型类型,它不应该导致此编译器错误吗?

2 个答案:

答案 0 :(得分:2)

您需要将def headOption移动到Stream特征中。目前,它位于Stream随播对象中。对象没有类型参数,因为对象只是内存中的一个确定事物,具有完全特定的类型。 Stream特征描述了许多可能的Stream对象,每个对象可以具有不同的类型,对应于创建对象时为A填充的类型。

请注意,您希望this中的headOption引用特定的Stream,而不是引用Stream随播广告对象。

答案 1 :(得分:1)

headOption应定义为多态函数,就像您对emptyapply所做的那样。因此,您需要在函数中添加类型注释,如下所示:

def headOption[A]: Option[A] = ...

但是,通常headOption应移动到特征,并在伴随对象中定义它是错误的。如果将其移动到特征,则会输入特征,因此您无需向函数添加类型注释,并且您当前的实现将起作用。