将函数应用于列表中的下两个元素

时间:2016-09-07 08:34:02

标签: list function haskell

我正在编写一个函数来为列表中的下两个元素应用一个函数。

例如:applyToTwo (+) [1,2,3,4]返回[3,5,7]

applyToTwo (-) [7,1,1,1,1]返回[6,0,0,0]

我想概括一下这个类型,以便它可以应用于我想要的任何类型。我的尝试是:

applyToTwo :: (a -> a -> b) -> [a] -> [a]
applyToTwo f [] = []
applyToTwo f [x] = []
applyToTwo f (x:x1:rest) = f x x1 ++ applyToTwo f (x1:rest)

顺便问一下,有没有办法概括要应用的元素数量,以便它可以应用于3,4,5?

2 个答案:

答案 0 :(得分:8)

看起来你只是用它的尾部压缩列表,所以你可以使用zipWith

applyToTwo f xs = zipWith f xs (tail xs)

答案 1 :(得分:2)

这应该做:

applyToTwo :: (a -> a -> b) -> [a] -> [b]
applyToTwo f [] = []
applyToTwo f [x] = []
applyToTwo f (x:x1:rest) = f x x1 : applyToTwo f (x1:rest)

应该可以推广到任意的arities,但它需要一些高级的类型级hackery。