在Scala的案例类中实现Ints列表不起作用

时间:2015-03-30 09:45:11

标签: list scala haskell

为什么在尝试使用案例类在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(只是程序和函数式编程)所以我假设类型系统和对象系统正在发生一些时髦的事情。

1 个答案:

答案 0 :(得分:5)

你可以像在Haskell中那样非常喜欢

def printList(x: List1) = {
   x match {
     case Cons(hd, tl) => println(hd); printList(tl)
     case Nil => 
  }
}  

您的问题是acc != Nil不足以让编译器理解accConsheadtail仅在Cons上提供。模式匹配是正常的方法。否则(更像对象),在head中提供tailList1

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
}