有时您想使用不同的折叠函数将元组列表折叠到一个元组中。例如,为了将runState结果列表粘贴在一起,获得(某种意义上)组合状态和组合结果。使用箭头折叠元组列表
考虑以下实现:
wish :: (a -> a' -> a) -> (b -> b' -> b) -> (a,b) -> [(a', b')] -> (a,b)
wish lfn rfn x xs = foldl (\(a,b) -> (lfn a) *** (rfn b)) x xs
虽然它的作品,我觉得不舒服关于这个拉姆达。 lfn *** rfn
本身有一种(a,b) -> (a -> a', b -> b')
类型,我无法找到一种正确应用于元组而无需诉诸模式匹配的方法。有没有一种清晰而优雅的方式我错过了?它可能是(a,a') -> (a -> a, a' -> a') -> (a, a')
类型的库函数,或者可能是一个完全不同的方法。
某种类型的BiApplicative类可以做。有可能是某个地方有瑕疵,但我会将其留给其他人以涵盖哪些是好的并且不被弃用。 – Carl
http://squing.blogspot.com/2008/11/beautiful-folding.html及其在Hackage上的实例化,http://hackage.haskell.org/package/ZipFold –