将函数的元组应用于元组



我正在尝试将函数元组应用于值元组

λ> 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(长度相同)实现这一点?

[我研究过这个问题,但它是为固定类型实现的。我需要一个通用实现]

动机:

我正在努力有效地写折页。

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)

我有两个不同的累加器acc1&acc2在列表上循环一次。我想为任意数量的累加器做这件事,所有累加器的类型都是a->b[其中a是列表中元素的类型,b是累加器输出的类型]它看起来很笨拙,必须使用fst和snd:/

访问元组

正如评论中提到的,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)

最新更新