2010-09-22 51 views
8
iterate :: (a -> a) -> a -> [a] 

(正如你可能知道的那樣)iterate是一個函數,它具有函數和起始值。然後它將函數應用於起始值,然後將相同的函數應用於最後的結果,依此類推。你將如何(重新)在Haskell中實現迭代?

Prelude> take 5 $ iterate (^2) 2 
[2,4,16,256,65536] 
Prelude> 

結果是一個無限列表。 (這就是爲什麼我使用take)。 我的問題你將如何在Haskell中實現自己的iterate'函數,僅使用基礎知識((:)(++) lambdas,模式mataching,警衛等)?

(Haskell的初學者在這裏)

回答

22

好,迭代構建價值通過遞增˚F一個的無限名單。所以我會寫,追加一定的價值一個到列表中通過遞歸調用迭代與構造函數開始:

iterate :: (a -> a) -> a -> [a] 
iterate f a = a : iterate f (f a) 

由於懶惰的評估,需要計算所構建的名單的那部分我的函數的值將被評估。

+0

感謝您的反饋。 – 2010-09-22 14:09:09

+0

這看起來像是「修復」定義「修復f = f(修復f)」的變體,類似於...「iterate f(fa)」,您可以使用修復來定義迭代: 「iterate fa = fix( \ rx - > x:r(fx))a「不是說它更好,只是認爲id說:) – QuantumKarl 2015-08-21 11:42:38

12

另請注意,您可以在報告的Standard Prelude中找到基本Haskell函數範圍的簡明定義。

通過這個直觀的定義列表,從原始圖元本質上引導一個豐富的圖書館可以非常具有教育意義,並且在爲「haskell方式」提供窗口方面開闊眼界。

我記得讀起來很早啊哈:data Bool = False | True

+0

不錯的鏈接!非常有教育意義! – 2010-09-22 15:02:14