2016-09-07 130 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) 
相關問題