我在 Real World Haskell 上遇到了以下句子:
懒惰的评估有一些令人毛骨悚然的效果。假设我们要找到未排序列表的 k 个最小值元素。在传统语言中,显而易见的方法是对列表进行排序并获取前 k 个元素,但这很昂贵。为了提高效率,我们将改为编写一个特殊函数,一次性获取这些值,并且它必须执行一些中等复杂的簿记。在 Haskell 中,sort-then-take 方法实际上执行得很好:惰性确保列表只会被排序到足以找到 k 个最小元素。
他们为此提供了代码实现:
minima k xs = take k (sort xs)
但是是这样吗?我认为即使在 Haskell 中,它也应该做一个完整的列表来取出k
元素。(想象一下在列表末尾有最小的数字)。我在这里错过了什么吗?