2015-06-27 77 views
4

假設我有一個像「where」關鍵詞是懶惰嗎?

foo = 8 + f1 
    where f1 = 8 + 9 
     f2 = 8 + 10 

f1明確了功能進行評估,但f2並不一定如此。它會是嗎?我可以看到評估每個where表達式是一個性能問題。

回答

6

是的,這是懶惰的,所以f2不會被評估,例如:

foo = 8 + f1 
    where f1 = 8 + 9 
      f2 = last [1..] 

將被立即計算,如果它是嚴格將永遠需要。

+1

值得注意的是,有趣的是,它明確地定義瞭如何構建一個thunk,所以你可以用它來改變一些函數的行爲,比如'foldl'。 – AJFarmar

+0

@AJFarmar聽起來很有趣,你可以打開或刪除更多詳細信息的鏈接? – bereal

+2

這可能很有用:https://wiki.haskell.org/Let_vs._Where。但是,您可能需要進行更廣泛的閱讀。另外,這裏是'foldl'的來源:http://hackage.haskell.org/package/base-4.8.0.0/docs/src/Data-Foldable.html#foldl%27 – AJFarmar