在 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: _*))
}
并要求您实现函数 tail,它应该 return 包含除第一个以外的所有值的列表。我通过以下方式实现了它:
def tail(ints: List[Int]): List[Int] = ints match {
case Cons(x, xs) => xs
}
(部分是因为我不知道如何实现传递的列表为Nil的情况)。
但是,当我在 List(1,2,3)
上对其进行测试时,以下是 returned:
Cons(2,Cons(3,Nil))
而不是:
List(2, 3)
这正是我所期待的。另外,我用的是intellij,IDE不让我写List(1,2,3).tail
,只能写tail(List(1,2,3))
.
谁能告诉我我做错了什么?为什么我的 tail 实现给我这样一个奇怪的 return 值?为什么 IDE 不让我写 List(1,2,3).tail
?传递的列表为Nil的情况如何实现?
Why won't the IDE let me write List(1,2,3).tail
?
您编写的是一个独立的方法,它将 List
作为传入参数。如果你想要的是拥有一个 List
return 自己的 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]
我正在自学 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: _*))
}
并要求您实现函数 tail,它应该 return 包含除第一个以外的所有值的列表。我通过以下方式实现了它:
def tail(ints: List[Int]): List[Int] = ints match {
case Cons(x, xs) => xs
}
(部分是因为我不知道如何实现传递的列表为Nil的情况)。
但是,当我在 List(1,2,3)
上对其进行测试时,以下是 returned:
Cons(2,Cons(3,Nil))
而不是:
List(2, 3)
这正是我所期待的。另外,我用的是intellij,IDE不让我写List(1,2,3).tail
,只能写tail(List(1,2,3))
.
谁能告诉我我做错了什么?为什么我的 tail 实现给我这样一个奇怪的 return 值?为什么 IDE 不让我写 List(1,2,3).tail
?传递的列表为Nil的情况如何实现?
Why won't the IDE let me write
List(1,2,3).tail
?
您编写的是一个独立的方法,它将 List
作为传入参数。如果你想要的是拥有一个 List
return 自己的 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]