鉴于我有一组具有相同输入但输出不同的函数:
(A -> B, A -> C, A -> D)
如何将其转换为返回相应输出元组的函数:
A -> (B,C,D)
是否存在针对此问题的通用解决方案,是否有名称?代码示例表示赞赏。
答案 0 :(得分:4)
非常简单。您只需解压缩元组并将其中的每个函数应用于相同的输入。
hoistTup :: (a -> b, a -> c, a -> d) -> (a -> (b, c, d))
hoistTup (f, g, h) x = (f x, g x, h x)
答案 1 :(得分:0)
Control.Arrow.(&&&)
为函数对执行此操作,但它不能立即扩展为更大的元组。
>>> (negate &&& (+1)) 3
(-3,4)
>>> (negate &&& (+1) &&& (+2)) 3
(-3,(4,5))
使用列出函数,您可以使用<*>
(在将输入包装在列表中之后):
>>> [negate, (+1), (+2)] <*> [3]
[-3, 4, 5]