List Haskell递归地将函数应用于每个元素,但首先?

List Haskell递归地将函数应用于每个元素,但首先?,list,function,haskell,recursion,optimization,List,Function,Haskell,Recursion,Optimization,所以我一直在做这个程序,它接收一个函数f,一个数字a和一个列表b,它应该返回一个列表[a,f(a,b),f(f(a,b),b,…]遍历列表b,并使用递归。你们知道我如何优化我的代码吗 calculate :: (a -> b -> a) -> a -> [b] -> [a] help :: (a -> b -> a) -> a -> [b] -> [a] help f a (x:xs) = (f a x) : (calculate f

所以我一直在做这个程序,它接收一个函数
f
,一个数字
a
和一个列表
b
,它应该返回一个列表
[a,f(a,b),f(f(a,b),b,…]
遍历列表
b
,并使用递归。你们知道我如何优化我的代码吗

calculate :: (a -> b -> a) -> a -> [b] -> [a]
help :: (a -> b -> a) -> a -> [b] -> [a]

help f a (x:xs) = (f a x) : (calculate f (f a x) xs)
help f a [] = []

calculate f a b = a : (help f a b)

计算fab=tail.concatMap(复制2)。扫描fa$b

复制位可能有错误。如果有,只需
calculate=scanl


这将代码转换为文本中的“
[a,f(a,b),f(f(a,b),b,…)
”,与之相矛盾(它与文本本身相矛盾,它谈论的是“遍历列表
b
”)。

关于
扫描f a(重复b)
?提示:
doit f(x:xs)=x:dou完整递归步骤f xs“你们知道如何优化我的代码吗?”你们说的“优化”是什么意思?你们对它的性能进行了计时吗?你们在问什么?谢谢。@AJFarmar不,我指的是一种缩短它的方法。你们确定这段代码做了你们希望它做的事情吗?如果我把它用作
calculate f a b=tail.concatMap(复制1),它的效果非常好.scanl f a$b
可以,但是
concatMap(replicate 1)
id
相同,
id.f
f
本身相同。使用
replicate 1
也不需要
tail