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