繁体   English   中英

在 Scala 中实现 List tail 方法

[英]implementing List tail method in Scala

我正在自学 Scala。 特别是,我正在关注 Chiusano 等人的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: _*))
}

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

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 列表传递为Nil的情况如何实现?

为什么 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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM