Haskell:对插入排序的懒惰与急切评估

时间:2012-05-21 08:03:24

标签: haskell

我现在仍然坚持IFPH第7章的一个问题。

练习7.1.2 ,内容如下:

sort的一个定义是sort = foldr insert []在哪里

insert x [] = [x]
insert x (y:ys) = if x <= y then x : y : ys else y : insert x ys

详细说明表达式sort [3,4,2,1]的急切和懒惰的评估减少序列,解释它们的不同之处“

现在,我首先开始使用急切的评估减少序列,我假设它是最里面的减少。

对我来说这会产生......

sort [3,4,2,1] 
=> foldr insert [] [3,4,2,1]
=> insert 3 (foldr insert [] [4,2,1])
=> insert 3 (insert 4 (foldr insert [] [2,1]
=> insert 3 (insert 4 (insert 2 (foldr insert [] [1])))
=> insert 3 (insert 4 (insert 2 (insert 1 (foldr [] []))))
=> insert 3 (insert 4 (insert 2 (insert 1 [])))
=> insert 3 (insert 4 (insert 2 [1]))
=> insert 3 (insert 4 (1 : insert 2 []))
=> insert 3 (insert 4 (1 : [2]))
=> insert 3 (1 : insert 4 [2])
=> insert 3 (1 : 2 : insert 4 [])
=> insert 3 (1 : 2 : [4])
=> insert 3 [1,2,4]
=> 1 : insert 3 [2,4]
=> 1 : 2 : insert 2 : [4]
=> 1 : 2 : 3 : [4]
=> [1,2,3,4]

哪个是排序列表。

现在进行懒惰评估,我能想到的唯一减少序列与急切评估的减少序列完全相同。当然,Haskell对延迟评估做了最左边的评估:但是我不认为它可以在大部分列表中运行,直到内部计算完成。

这种推理是否正确?直觉告诉我没有。

如果有人可以指出如何执行非常棒的懒惰评估减少序列。

谢谢

1 个答案:

答案 0 :(得分:10)

在包含

的行上
insert 3 (1 : insert 4 [2])

您已计算出足够的第二个参数到外部insert,您可以运行计算,给出下一行

if 3 <= 1 then 3 : 1 : insert 4 [2] else 1 : insert 3 (insert 4 [2])

现在您可以运行if语句,将下一个计算作为

1 : insert 3 (insert 4 [2])     -- (LAZY)

而不是热切评估的内容:

insert 3 (1 : 2 : insert 4 [])  -- (EAGER)

使用延迟评估,在对​​列表的其余部分进行排序之前,计算结果的第一个元素是1 - 与急切评估形成对比,急切评估在找到列表之前对列表的整个尾部进行排序第一个元素是。

相关问题