【发布时间】:2013-05-21 18:14:43
【问题描述】:
有时您想使用不同的折叠函数将一组元组折叠成一个元组。例如,为了将 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') 类型的库函数,也可能是完全不同的方法。
【问题讨论】:
-
某种 BiApplicative 类就可以了。可能有一个关于 hackage 的地方,但我会留给其他人来介绍哪些是好的和不被弃用的。