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替换了一个列表值(这是不需要的)。