HOWTO将函数元组转换为发出元组的函数

时间:2016-07-14 13:46:59

标签: haskell functional-programming tuples

鉴于我有一组具有相同输入但输出不同的函数:

(A -> B, A -> C, A -> D)

如何将其转换为返回相应输出元组的函数:

A -> (B,C,D)

是否存在针对此问题的通用解决方案,是否有名称?代码示例表示赞赏。

2 个答案:

答案 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]