2016-02-27 54 views
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]))上

  1. 呼叫dropWhile而是採用List.dropWhile([List[A]], [f: A => Boolean])
  2. 傳遞,而不是限定的功能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

誰能解釋,如果以上兩點可以完成,如果是這樣,怎麼樣?

回答

1

爲了您能夠在性狀List的實例上調用dropWhile,該特徵必須聲明此函數。該對象同名包含此功能不會自動這種方法「添加」到性狀的事實。

您可以輕鬆地通過改變特徵定義添加這樣的功能,以List特點:

sealed trait List[+A] { 
    def dropWhile(f: A => Boolean): List[A] = List.dropWhile(this, f) 
} 

然後,您建議的代碼按預期工作。

至於傳遞一個匿名函數 - 在這種情況下,編譯器不能推斷出其自身的Int類型,所以你必須明確地寫出類型,如下所示:

println(List.dropWhile(List(1, 2, 3, 4, 5), (i: Int) => i < 3)) 
+0

感謝您的幫助。要添加到你的答案,你實際上也可以對類似'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))'。 –

相關問題