我试图将一组函数应用于值元组
λ> 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访问元组:/
答案 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)