将函数元组应用于元组

时间:2015-03-30 20:08:41

标签: haskell

我试图将一组函数应用于值元组

λ> 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访问元组:/

1 个答案:

答案 0 :(得分: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)