在 Scala 中实现 List tail 方法



我正在自学Scala。特别是,我正在关注Chiusano等人的《Functional programming in Scala》一书。第3章介绍了链表的实现:

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: _*))
}

并要求您实现函数尾巴,该函数应返回一个包含除第一个值之外的所有值的列表。我通过以下方式实现它:

def tail(ints: List[Int]): List[Int] = ints match {
case Cons(x, xs) => xs
}

(部分原因是我不知道如何实现传递列表为 Nil 的情况)。 但是,当我在List(1,2,3)上测试它时,返回以下内容:

Cons(2,Cons(3,Nil))

而不是:

List(2, 3)  

这就是我所期待的。此外,我使用的是 intellij,IDE 不会让我写List(1,2,3).tail,而只会tail(List(1,2,3))

谁能告诉我我做错了什么?为什么我的尾实现给了我这么奇怪的返回值?为什么 IDE 不允许我写List(1,2,3).tail?如何实现列表通过为零的情况?

为什么

IDE不让我写List(1,2,3).tail

您编写的是一个独立方法,该方法将List作为传入参数。如果你想要的是让一个List返回自己的tail那么你实际上已经完成了一半。

Cons已经有一个tail成员,你只需要将其提升到List定义,并为Nil提供一个合理的实现。

sealed trait List[+A] {
val tail: List[A]
}
case object Nil extends List[Nothing] {
lazy val tail =
throw new UnsupportedOperationException("tail of empty List")
}
case class Cons[+A](head: A, tail: List[A]) extends List[A]

相关内容

  • 没有找到相关文章

最新更新