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

ale*_*sch 2 lambda haskell loops

当我把以下lambda表达式放入ghci我得到1:

ghci> (\x -> x+1) 0
1
Run Code Online (Sandbox Code Playgroud)

但是,当我使用该功能时,iterate我得到了

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

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

Joh*_*n L 10

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


Ing*_*ngo 7

更具体地说,迭代是这样实现的:

iterate f v = v : iterate f (f v)
Run Code Online (Sandbox Code Playgroud)

请记住,您给迭代的起始值将首先出现在列表中 - 就是这样.


Dan*_*ton 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), ...]
Run Code Online (Sandbox Code Playgroud)

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