在Haskell中生成无限序列

时间:2009-11-23 19:05:46

标签: haskell infinite-sequence

我知道在Haskell中有无限的序列是可能的 - 但是,我不完全确定如何生成一个

给出方法

generate::Integer->Integer
取一个整数并生成序列中的下一个整数的

,我将如何构建一个无限序列呢?

3 个答案:

答案 0 :(得分:14)

如果您希望序列从1开始,那么它是 -

iterate generate 1

请注意功能的第一个字母是小写,而不是大写。否则它将是数据类型,而不是函数。

//编辑:我刚才意识到不仅数据类型以大写开头,它也可能是数据构造函数或类型类,但这不是重点。 :)

答案 1 :(得分:13)

添加到Matajon的答案:除了在这里询问之外,发现iterate功能的方法是使用Hoogle。

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

答案 2 :(得分:5)

有几种方法可以做到,但其中一种方法是:

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

此函数使用功能f和一些valus s并返回s,之后它会使用相同的f调用自身,并返回{{1}的结果}}。示范:

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与Prelude(和Data.List)中的函数iterate相同。