“迭代”会改变应用函数的含义吗?

时间:2011-09-09 12:39:28

标签: haskell lambda loops

当我在ghci中放入以下lambda表达式时,我得到1

ghci> (\x -> x+1) 0
1

但是当我使用iterate函数时,我得到了

ghci> take 10 (iterate (\x -> x+1) 0)
[0,1,2,3,4,5,6,7,8,9]

我希望得到一个等于[1..10]的列表。为什么不呢?

3 个答案:

答案 0 :(得分:10)

迭代的第一个结果是没有应用函数的原始输入,即函数被调用0次。这就是为什么结果与你期望的结果有关。

答案 1 :(得分:7)

更具体地说,实现了迭代:

iterate f v = v : iterate f (f v)

请记住,你给迭代的起始值将首先出现在列表中 - 就是它。

答案 2 :(得分:5)

停止...... Hoogle时间!

http://haskell.org/hoogle/?hoogle=iterate

点击iterate

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:iterate

  

iterate f x会返回fx重复申请的无限列表:

 iterate f x == [x, f x, f (f x), ...]

你去吧。它的工作原理是因为它就是它的工作方式。我并不想轻浮,只是希望能够说明Hoogle和文档的有用性。 (听起来像Haskell乐队的一个好名字:“Hoogle和Docs”)