Haskell/解決方案/惰性
外觀
| 練習 |
|---|
f x = length [head x] g x = length (tail x) |
- 因為
show x需要評估x才能將其轉換為String。 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替換了一個列表值(這是不需要的)。