我正在閱讀"Functional Programming in Scala"這本書,並且遇到了一個我不完全瞭解的例子。Scala名稱參數的使用
在上嚴格的章節/懶惰作者描述流的結構,並有這樣的代碼:
sealed trait Stream[+A]
case object Empty extends Stream[Nothing]
case class Cons[+A](h:() => A, t:() => Stream[A]) extends Stream[A]
object Stream {
def cons[A](hd: => A, tl: => Stream[A]) : Stream[A] = {
lazy val head = hd
lazy val tail = tl
Cons(() => head,() => tail)
}
...
}
我的問題是在智能構造(cons
),它調用構造函數Cons
案例分類。用來通過head
和tail
vals的特定語法對我來說沒有意義。爲什麼不這樣調用構造函數:
Cons(head, tail)
據我瞭解語法使用的是強要2名Function0對象只返回head
和tail
丘壑的創建。這與剛剛通過head
和tail
(沒有() =>
前綴)有什麼不同,因爲Cons
案例類已被定義爲無論如何都採用這些參數?這不是多餘的嗎?或者我錯過了什麼?
是的。對於那個很抱歉。正如我提到的@Jesper,我應該注意到兩個構造函數的區別,並沒有。所以'Cons'需要一個明確的Function0和'cons'爲你構建一個(在幕後)。什麼傳遞給'Cons'會立即被評估,傳遞給'cons'的是稍後評估的。是對的嗎? – melston 2014-10-30 21:33:54
是的。當你按照價值傳遞時,它每次讀取時都會被重新評估。 – Nate 2015-10-05 22:01:35