有时您想使用不同的折叠函数将一组元组折叠成一个元组。例如,为了将 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
虽然它有效,但我对这个 lambda 感到不舒服。lfn *** rfn
本身有一种类型(a,b) -> (a -> a', b -> b')
,我无法找到一种方法来正确应用到元组而不求助于模式匹配。我想念一种清晰而优雅的方式吗?它可能是类型的库函数(a,a') -> (a -> a, a' -> a') -> (a, a')
或完全不同的方法。