跳轉到內容

Haskell/解決方案/惰性

來自華夏公益教科書,開放的書籍,為開放的世界

← 返回惰性

練習
  1. 為什麼我們必須完全將x評估為正規化才能在f x y = show x中使用它?
  2. 哪個函式更嚴格?
f x = length [head x]
g x = length (tail x)
  1. 因為show x需要評估x才能將其轉換為String
  2. g更嚴格:它必須遍歷整個列表以發現其長度,即使它不需要檢查單個值。

相反,為了評估length [head x],當length評估傳遞的列表時,它會得到thunk_0:[],其中thunk_0表示head x的結果。因此,您可以驗證f undefined => 1(實際上,f等效於const 1),而g undefined則失敗。還要注意,如果ls是一個有效的Int列表(在它的元素中不包含undefined),則以下所有表示式都無法評估

g (1:undefined) => length undefined => undefined

而以下表達式則可以成功評估

g (1:undefined:ls) => length (undefined:ls) => 1 + length ls
g (undefined:ls) => length ls

g (1:undefined)g (1:undefined:ls)之間的差異可能看起來令人困惑,但它是正確的,因為在第一種情況下,undefined替換了一個列表(特別是,傳遞給g的cons單元格的尾部),而在第二種情況下,undefined替換了一個列表值(這是不需要的)。

華夏公益教科書