我需要做的是交替应用列表中的两个函数。例如:
(*2) (-3) [4,5,6,7,8]
会导致
[8,2,12,4,16]
,因为4*2
,5-3
,6*2
,7-3
,8*2
...
我在想的是
funct :: (a -> b) -> (a -> b) -> [a] -> [b]
然后像这样的东西
不过,我不会只有"f
",还会有其他的功能。
所以我在考虑检查x
的位置。如果是偶数位置,则为f x
。否则为g x
。
有人能帮帮我吗?
Tks。
发布于 2020-11-16 08:23:57
您可以始终使用显式递归将其写出来,以便完全清楚它的工作原理:
alternateFunctions _ _ [] = []
alternateFunctions f g (x:xs) = f x:alternateFunctions g f xs
对于一个空的列表,没有什么可做的。否则,将第一个函数应用于第一个元素,并对列表的其余部分应用递归,同时切换第一个和第二个函数。这样,您就拥有了所需的alternateFunctions (*2) (subtract 3) [4,5,6,7,8] = [8,2,12,4,16]
。
如果您关心性能,那么您应该将其重写为foldr
,以便它可以融合:
alternateFunctions f g xs = foldr go mempty xs f g
where go x acc f g = f x:acc g f
https://stackoverflow.com/questions/64851169
复制相似问题