为什么在尝试使用案例类在Scala中实现链表时会出现错误?
因为我对Haskell非常熟悉,所以我基本上试图将这个Haskell代码转换为Scala:
Data List = Cons Int List | Nil
instance Show List where
show x = helper x ""
where
helper Nil acc = acc
helper (Cons n xs) acc = let y = acc ++ " " ++ show n in helper xs y
这是我的Scala代码:
abstract class List1
case class Cons(head : Int, tail : List1) extends List1
case object Nil extends List1
object thing {
def printList (x : List1) {
var acc = x
while (acc != Nil) {
println (acc.head)
acc = acc.tail
}
}
val a : List1 = Cons(1,Cons(2,Cons(3,Cons(4,Nil))))
printList(a)
}
然而,我得到一个奇怪的错误,当我调用acc.tail时,这不是List1的一部分,也不是Nil,即使它们都扩展了List1。我不太了解OOP(只是程序和函数式编程)所以我假设类型系统和对象系统正在发生一些时髦的事情。
答案 0 :(得分:5)
你可以像在Haskell中那样非常喜欢
def printList(x: List1) = {
x match {
case Cons(hd, tl) => println(hd); printList(tl)
case Nil =>
}
}
您的问题是acc != Nil
不足以让编译器理解acc
是Cons
。 head
和tail
仅在Cons
上提供。模式匹配是正常的方法。否则(更像对象),在head
中提供tail
和List1
:
sealed trait List1 {
def head: Int
def tail: List1
def isEmpty: Boolean
}
case class Cons(head: Int, tail: List1) extends List1 {
def isEmpty = false
}
case object Nil extends List1 {
def head = sys.error("Head on Nil")
def tail = sys.error("Tail on Nil")
def isEmpty = true
}