我现在仍然坚持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
Run Code Online (Sandbox Code Playgroud)
详细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]
Run Code Online (Sandbox Code Playgroud)
哪个是排序列表.
现在对于懒惰的评估,我能想到的唯一减少序列与急切评估的减少序列完全相同.当然,Haskell对延迟评估进行了最左边的评估:但我不认为它可以在大部分列表中运行,直到内部计算完成.
这个推理是否正确?直觉告诉我没有.
如果有人可以指出如何执行懒惰的评估减少序列,这将是伟大的.
谢谢
Chr*_*lor 10
在包含的行上
insert 3 (1 : insert 4 [2])
Run Code Online (Sandbox Code Playgroud)
你已经计算了足够的第二个参数到外部insert
,你可以运行计算,给出下一行
if 3 <= 1 then 3 : 1 : insert 4 [2] else 1 : insert 3 (insert 4 [2])
Run Code Online (Sandbox Code Playgroud)
现在你可以运行if语句,将下一个计算作为
1 : insert 3 (insert 4 [2]) -- (LAZY)
Run Code Online (Sandbox Code Playgroud)
而不是你热切评价的东西:
insert 3 (1 : 2 : insert 4 []) -- (EAGER)
Run Code Online (Sandbox Code Playgroud)
使用延迟评估,您可以1
在排序列表的其余部分之前计算结果的第一个元素- 与急切评估形成对比,急切评估在找到第一个元素之前对列表的整个尾部进行排序.