2

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

给定一个方法

generate::Integer->Integer

它取一个整数并产生序列中的下一个整数,我将如何从中构建一个无限序列?

4

3 回答 3

14

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

iterate generate 1

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

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

于 2009-11-23T19:12:49.343 回答
13

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

Hoogle 对该查询的第一个答案 (a -> a) -> [a]iterate.

于 2009-11-23T19:27:37.350 回答
7

有几种方法可以做到这一点,但一种是:

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

这个函数接受一个函数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

编辑:确实,与Prelude(和 Data.List)gen中的功能相同。iterate

于 2009-11-23T19:15:58.247 回答