【发布时间】:2020-01-08 14:23:08
【问题描述】:
我正在编写 Scala 函数式编程第 5 章中的 Stream 类,我知道解决方案是在线的,但它对我没有帮助。我在上一章编写 List 类时遇到了同样的问题。
我非常沮丧,实际上将解决方案复制粘贴到我的 Scala 工作表中,但仍然是同样的问题。
我想可能是因为名字的原因(已经有一个 List 和 Stream),这样命名它们似乎不是一个聪明的主意,所以我改变了它,没有帮助。
也许这与 Intellij 有关(我正在使用 IntelliJ IDEA),我正在 Scala Worksheets 上进行练习。但我找不到任何与 IDE 相关的问题。
这是我目前所拥有的:
sealed trait StreamRED[+A]
case object Empty extends StreamRED[Nothing]
case class Cons[+A](h: () => A, t: () => StreamRED[A]) extends StreamRED[A]
object StreamRED {
def cons[A](hd: => A, tl: => StreamRED[A]): StreamRED[A] = {
lazy val head = hd
lazy val tail = tl
Cons(() => head, () => tail)
}
def empty[A]: StreamRED[A] = Empty
def apply[A](as: A*): StreamRED[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())
}
def toList: List[A] = {
@annotation.tailrec
def go(s: StreamRED[A], acc: List[A]): List[A] = s match {
case Cons(h,t) => go(t(), h() :: acc)
case _ => acc
}
go(this, List()).reverse
}
}
我收到以下错误:
Option[A](在 headOption 方法中)和 List[A] 和 StreamRED[A](在 toList 中)中的 A 上的“无法解析符号 A”
“类型不匹配。必需:StreamRED[Any],找到:StreamRED.type”在 toList 中的 this 上。
“模式类型与预期类型不兼容,在 headOption 中的 Empty 上找到:Empty.type,必需:StreamRED.type”。
Scala 新手,IntelliJ 新手,静态类型语言新手,FP 新手。非常感谢任何对优秀阅读材料的解释和建议。
【问题讨论】:
标签: scala