访问元组
我正在尝试将函数元组应用于值元组
λ> 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)