在Haskell中生成无限序列

Mar*_*tin 2 haskell infinite-sequence

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

给定一种方法

generate::Integer->Integer
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*náš 14

如果你想让你的序列从1开始那么它是 -

iterate generate 1
Run Code Online (Sandbox Code Playgroud)

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

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


yai*_*chu 13

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

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


Ste*_*202 5

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

gen :: (a -> a) -> a -> [a]
gen f s = s : gen f (f s)
Run Code Online (Sandbox Code Playgroud)

这个函数需要一个功能f和一些valus 并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]
Run Code Online (Sandbox Code Playgroud)

在上面的例子中succ充当generate :: Integer -> Integer你提到的功能.但请注意,这gen将适用于任何类型的函数a -> a.

编辑:实际上,geniteratePrelude(和Data.List)中的函数相同.