跳转到内容

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

华夏公益教科书