我想定义一个无限列表,其中每个元素都是前面所有元素的函数。
因此,列表中的n+1
元素将为f [x1, x2, ..., xn]
。
这看起来很简单,但我似乎无法理解如何做到这一点。有人可以帮忙吗?
答案 0 :(得分:10)
gen f = xs where xs = map f $ inits xs
或者
gen f = fix $ map f . inits
答案 1 :(得分:4)
作为另一个答案的替代方案,希望更具可读性但不那么简洁:
-- "heads f" will generate all of the the prefixes of the inflist
heads f = map ( (flip take) (inflist f) ) [1..]
-- inflist will generate the infinite list
inflist f = ( f [] ) : map f (heads f)
-- test function
sum1 s = 1 + sum s
-- test run
>> take 5 (inflist sum1)
[1,2,4,8,16]
UPD:
如上所述,heads
函数可以替换为inits
,我不知道它存在。
答案 2 :(得分:2)
您可以使用unfoldr
:
import Data.List
gen :: ([a] -> a) -> a -> [a]
gen f init = unfoldr (\l -> let n = f (reverse l) in (Just (n, n:l))) [init]
请注意,每次都必须反转输入列表。您可以改为使用Data.Sequence
:
import Data.Sequence
genSeq :: (Seq a -> a) -> a -> Seq a
genSeq f init = unfoldr (\s -> let n = f s in (Just (n, s |> n))) (singleton init)