【发布时间】:2012-11-28 07:48:46
【问题描述】:
我是 Haskell 的新手,我正在为我的编程语言课写一篇关于它的论文。我想用一些示例代码来展示 Haskell 的懒惰,但我不确定我所看到的是否真的是懒惰。
doubleMe xs = [x*2 | x <- xs]
在 ghci 中:
let xs = [1..10]
import Debug.Trace
trace (show lst) doubleMe (trace (show lst) doubleMe (trace (show lst) doubleMe(lst)))
输出:
[1,2,3,4,5,6,7,8,9,10]
[1,2,3,4,5,6,7,8,9,10]
[1,2,3,4,5,6,7,8,9,10]
[8,16,24,32,40,48,56,64,72,80]
感谢您的宝贵时间和帮助!
【问题讨论】:
-
如果你想显示惰性,为什么不直接使用无限列表,然后显示计算(首先获取
n值,搜索传递谓词的值等)?两个经典的例子是素数和斐波那契数列。 -
感谢您的建议。如果我没有得到关于我现在拥有的代码的答案,我会调查这些。
-
你认为你的代码示例为什么表现出惰性?我认为您可能将惰性与不变性混淆了。 (我认为
lst应该是xs。) -
您可能还对Why is lazy evaluation useful? 感兴趣。一个答案给出了nice example:
head . quickSort仅具有 O(n) 复杂性,因为未计算排序列表的其余部分。