【发布时间】:2012-10-04 05:09:32
【问题描述】:
对于所需的无限列表,我有两件事:它的第一个元素
x :: A
以及生成下一个元素的函数
f :: [A] -> A
创建无限列表的最佳(最惯用的?最快的?)方法是什么?我是说
xs = x : f [x] : f [x, f [x]] : f [x, f [x], f [x, f [x]]] : ...
【问题讨论】:
-
你在搜索unfoldr函数吗?
-
unfoldr 的类型为
unfoldr :: (b -> Maybe (a, b)) -> b -> [a],所以您的意思是将“当前”整个列表返回为b,并将下一个元素返回为a?谢谢,这似乎真的有效=) -
但是有没有更直接的方法?
-
infiniteList = x:map f (tail $ inits infiniteList)其中x是第一个元素,f是要应用于每个前缀的函数。 -
您可以使用迭代:
map head $ iterate (\l -> f l : l) [x]。注意l是颠倒的(l是前面元素的列表),所以可能是\l -> f (reverse l) : l。