2015-03-30 57 views
2

我試圖函數的元組應用到值應用功能的元組的元組

λ> let foo = ((+1), (*3), ((:)5)) #Each function has type: a -> a 

λ> let bar = (1, 5, [0])   #Each value of the corresponding tuple has type a 

的元組如何實現:

toImplement foo bar = ? 

這樣的:

λ> toImplement foo bar 
-> (2, 15, [0,5]) # using foo and bar above 

對於任何有效的foo和bar(長度相同),你如何實現這一點?

[我看着this problem,但它是爲一個固定類型實現的。我需要一個通用的實現]

動機:

我試圖有效地編寫倍。

let acc1 = \x acc -> x*x:acc 
let acc2 = (+) 
foldr (\x acc -> (acc1 x (fst acc), acc2 x (snd acc))) ([],0) [1..10] 
> ([1,4,9,16,25,36,49,64,81,100],55) 

我有2個不同的蓄電池ACC1 & ACC2這個循環在列表中只出現一次。我想這樣做的任意數量的累加器都有類型a - > b [其中a是列表中元素的類型,b是累加器的輸出類型] 它看起來笨拙,必須使用fst和snd訪問元組:/

+3

「你怎麼能實現這個一般對於任何有效的foo和bar(長度相同的)?」 ---你不能使它成爲通用的元組。 – zerkms 2015-03-30 20:11:57

+2

你不能寫一個可以處理任意大小的元組的'toImplement'。當然,使用高級語言功能和一系列擴展可能會有一些非常糟糕的方法,但它可能比爲了得到'toImplement','toImplement3'複製/粘貼基本相同的定義更加麻煩'... toImplementN'。 – bheklilr 2015-03-30 20:12:54

+0

爲什麼Haskell不允許使用任意元組? – GeneralBecos 2015-03-30 20:32:06

回答

6

正如評論中所述,haskell不允許爲任意大小的元組實現泛型函數。因此,您需要分別爲每個尺寸實現特定的功能。

如:

toImplement3 :: (b0 -> c0, b1 -> c1, b2 -> c2) -> (b0, b1, b2) -> (c0, c1, c2) 
toImplement3 (f1, f2, f3) (a1, a2, a3) = (f1 a1, f2 a2, f3 a3) 
+0

@bheklilr謝謝。稍微修復它雖然 – zerkms 2015-03-30 20:22:28