當我把在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]
列表。爲什麼不?
當我把在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]
列表。爲什麼不?
迭代的第一個結果是沒有應用函數的原始輸入,即該函數被調用0次。這就是爲什麼結果與你所期望的相反。
更具體地說,迭代實現這個謊言:
iterate f v = v : iterate f (f v)
只要記住,你給迭代起始值將首先出現的thelist - 僅此而已。
Stop ... 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
返回f
反覆應用到x
無限列表:iterate f x == [x, f x, f (f x), ...]
你走了。它以這種方式工作,因爲它就是這麼說的。我並非試圖輕視,只是希望說明Hoogle和文檔的用處。 (聽起來像是一個Haskell樂隊的好名字:「Hoogle and the Docs」)
haddock的好處之一是每個函數旁都有一個源代碼鏈接。如果您想知道特定功能的工作原理,請在Hoogle上查找並點擊源鏈接。英戈在下面給出了正確的答案。 –