2009-11-23 43 views
2

無限序列我知道無限序列可能在Haskell - 但是,我不完全知道如何生成一個生成哈斯克爾

給出的方法

generate::Integer->Integer 

其採用整數並將產生序列中的下一個整數,我將如何建立一個無限序列呢?

回答

14

如果您希望您的序列從1開始,那麼它就是 -

iterate generate 1 

請注意的函數,第一個字母是小寫,大寫沒有。否則,它將是數據類型,而不是函數。

//編輯:我剛剛意識到不只是數據類型以大寫開頭,它也可能是數據構造函數或類型類,但那不是重點。 :)

4

有幾種方法可以做到這一點,但一個是:

gen :: (a -> a) -> a -> [a] 
gen f s = s : gen f (f s) 

此功能需要一個functon f和一些衣被合計s並返回s,後至極其與相同f自稱,和f s的結果。示範:

Prelude> :t succ 
succ :: (Enum a) => a -> a 
Prelude> let gen f s = s : gen f (f s) 
Prelude> take 10 $ gen succ 3 
[3,4,5,6,7,8,9,10,11,12] 

在上面的例子succ充當其你提到的功能generate :: Integer -> Integer。但請注意gen可以與a -> a類型的任何函數一起使用。

編輯:實際上,gen與Prelude(和Data.List)中的函數iterate相同。

13

添加到Matajon的答案:發現iterate函數的一種方法,除了問這裏之外是使用Hoogle。

Hoogle's first answer for the query(a -> a) -> [a]iterate

+2

傳播Hoogle意識的+1。 –

+0

+1將我介紹給Hoogle:D – Martin