在Haskell中构造无限列表

时间:2012-10-13 17:18:49

标签: haskell infinite-sequence

对于所需的无限列表,我有两件事:它的第一个元素

x :: A

和生成下一个元素的函数

f :: [A] -> A

创建无限列表的最佳方式(最惯用,最快?)方式是什么?我的意思是

xs = x : f [x] : f [x, f [x]] : f [x, f [x], f [x, f [x]]] : ...

2 个答案:

答案 0 :(得分:7)

您想要的功能可以实现为:

constructInf :: ([a] -> a) -> a -> [a]
constructInf f x = xs
  where xs = x:map f (tail $ inits xs)

consrtuctInf的性能取决于它的参数函数f的性能。假设f需要O(N)时间,那么constructInf将花费O(M * N)时间,其中M是您将检查的constructInf结果中的元素数。

答案 1 :(得分:1)

你想要iterate

take 10 $ iterate (+1) 0

= [0,1,2,3,4,5,6,7,8,9]

如果您到目前为止需要整个列表,并且不介意将其颠倒过来,您可以这样做:

mkl f x0 = x0 : unfoldr (\xs -> let x = f xs in Just (x, x:xs)) [x0]

如果你到目前为止需要整个列表,并且你想要它按顺序排列,它将是非常低效的,但你可以这样做:

mkl' f x0 = x0 : unfoldr (\xs -> let x = f xs in Just (x, xs ++ [x])) [x0]

但我不确定为什么你需要整个列表而不是最后一个元素。