2016-09-07 146 views
1

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

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

applyToTwo (-) [7,1,1,1,1] return [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

这应该这样做:

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

推广到任意arities应该是可能的,但它需要一些先进型级别的两轮牛车。

+1

正如我在回答中指出了一个类似的问题,可以更换前两例'applyToTwo如果它在'applyToTwo f(x:x1:rest)'case后面列出,则为f _ = []'。 – chepner

8

看样子你只是荏苒列表以及它的尾巴,所以你可以使用zipWith

applyToTwo f xs = zipWith f xs (tail xs) 
相关问题