Does this Haskell example effectively demonstrate laziness?
我是哈斯克尔的新手,我正在为我的编程语言课写一篇论文。我想用一些示例代码来演示haskell的懒惰,但是我不确定我看到的是否实际上是懒惰。
1 | doubleMe xs = [x*2 | x <- xs] |
在GHCI中:
1 2 3 |
号
输出:
1 2 3 4 | [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] |
谢谢你的时间和帮助!
你在这里使用
你可以做些像
1 2 3 4 5 6 7 8 |
在这里,您可以看到只有5个数字是双倍的,因为只请求了5个结果;尽管给出了
注意,
无限的溪流总是一个很好的例子。如果没有特殊的结构,就不能用其他语言获得它们——但是在haskell中,它们是非常自然的。
一个例子是斐波那契流:
另一种方法是使用试算除法获得素数流:
1 2 3 4 |
此外,在Haskell中实现回溯非常简单,使您能够根据需要轻松获得解决方案列表:
http://rosettacode.org/wiki/n-queens haskell问题
下面是一个更复杂的示例,展示了如何实现min:
懒惰的评估和时间复杂性
它基本上展示了如何使用haskell的laziness来获得一个非常优雅的
你可以用人为的例子来证明哈斯克尔的懒惰。但是,我认为展示懒惰如何帮助您开发解决常见问题的方案要比其他语言具有更大的模块性要好得多。
懒惰的主要点是不需要计算的值——所以为了证明这一点,您必须显示出没有被评估的东西。您的示例并不是演示懒惰的最佳方法,因为最终会计算所有值。
以下是一个小例子,作为起点:
1 2 3 4 |
这句话立刻打招呼——如果不是懒惰的话,整个事情就会半途而废。
简短的回答是"不"。Leftaroundabout在他的回答中很好地解释了这一点。
我的建议是:
这应该比尝试围绕无限的数据流或打结技巧更容易。