我正在自學 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: _*))
}
并要求您實作尾部函式,該函式應該回傳一個包含除第一個以外的所有值的串列。我已經通過以下方式實作了它:
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?傳遞的list為Nil的情況如何實作?
uj5u.com熱心網友回復:
為什么IDE不讓我寫
List(1,2,3).tail?
您撰寫的是一個將 aList作為傳入引數的獨立方法。如果您想要的是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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/401910.html
