我知道在 Haskell 中可以实现无限序列 - 但是,我不完全确定如何生成一个
给定一个方法
generate::Integer->Integer
它取一个整数并产生序列中的下一个整数,我将如何从中构建一个无限序列?
我知道在 Haskell 中可以实现无限序列 - 但是,我不完全确定如何生成一个
给定一个方法
generate::Integer->Integer
它取一个整数并产生序列中的下一个整数,我将如何从中构建一个无限序列?
如果您希望您的序列从 1 开始,那么它是 -
iterate generate 1
请注意函数的第一个字母是小写的,而不是大写的。否则它将是数据类型,而不是函数。
//编辑:我刚刚意识到不仅数据类型以大写开头,它也可以是数据构造函数或类型类,但这不是重点。:)
添加到 Matajon 的答案:iterate
除了在这里询问之外,发现该功能的一种方法是使用 Hoogle。
Hoogle 对该查询的第一个答案 (a -> a) -> [a]
是iterate
.
有几种方法可以做到这一点,但一种是:
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