0
我有以下斯卡拉代碼來回答問題4(在清單上實現dropWhile,它將從列表前綴中刪除元素,只要它們與謂詞匹配)第3章Functional Programming In Scala:將方法添加到列表並傳遞匿名參數
object Chapter3 {
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 apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
def dropWhile[A](l: List[A], f: A => Boolean): List[A] =
l match {
case Nil => sys.error("cannot drop from empty list")
case Cons(h, t) if f(h) => dropWhile(t, f)
case _ => l
}
}
def main(args : Array[String]) {
def smallerThanThree(i: Int): Boolean = i < 3
println(List.dropWhile(List(1, 2, 3, 4, 5), smallerThanThree))
// How can I call this directly on the list with anonymous function like below?
println(List(1, 2, 3, 4, 5).dropWhile(i => i < 3))
// => Should return List(3, 4, 5) or Cons(3, Cons(4, Cons(5, Nil))).
}
}
我想要做的是兩方面的:列表對象(List(1,2,3,4,5).dropWhile([f: A => Boolean])
)上
- 呼叫
dropWhile
而是採用List.dropWhile([List[A]], [f: A => Boolean])
- 傳遞,而不是限定的功能
smallerThanThree
並傳遞該匿名方法(i => i < 3
)。
現在,這給出了錯誤:
error: value dropWhile is not a member of Main.List[Int]
而匿名函數不也行。當我做
println(List.dropWhile(List(1, 2, 3, 4, 5), i => i < 3))
它給人的錯誤:
error: missing parameter type
誰能解釋,如果以上兩點可以完成,如果是這樣,怎麼樣?
感謝您的幫助。要添加到你的答案,你實際上也可以對類似'i => i <3'的匿名函數進行類型干涉。如果簽名(和實現)更改如下,則可以這樣做:'def dropWhile [A](l:List [A])(f:A => Boolean):List [A]'。然後你可以改變trait中的方法:'def dropWhile(f:A => Boolean):List [A] = List.dropWhile(this)(f)'。您不必指定類型,可以使用'dropWhile'如下:'println(List(1,2,3,4,5).dropWhile(i => i <3))'。 –