Haskell中的函数组合与元组参数

时间:2011-06-04 14:22:15

标签: haskell tuples currying function-composition

有时我有两种形式的功能:

f :: a -> (b1,b2)
h :: b1 -> b2 -> c

我需要组合物g。我通过将h改为h':

来解决这个问题
h' :: (b1,b2) -> c

你能告诉我(如果可能的话)一个函数m,以便:

(h . m . f) == (h' . f)

或另一种处理此类情况的方法。感谢。

2 个答案:

答案 0 :(得分:16)

您要做的是采用对 curried 参数进行操作的函数h,并将其应用于f的结果,这是一个元组。这个过程将两个参数的函数转换为一个接受一个元组参数的函数,称为 uncurrying 。我们来自Data.Tuple

curry :: ((a, b) -> c) -> a -> b -> c 
   -- curry converts an uncurried function to a curried function.

uncurry :: (a -> b -> c) -> (a, b) -> c
   -- uncurry converts a curried function to a function on pairs.

现在我们可以写:

f :: a -> (b,c)
f = undefined

h :: b -> c -> d
h = undefined

k :: a -> d
k = uncurry h . f

另一个想到这一点的棘手方法是通过一个应用函子,

k = (h <$> fst <*> snd) . f

康纳麦克布莱德的想法,我认为它是:(|f fst snd|) . f

答案 1 :(得分:9)

您要做的是 uncurry h。此功能需要a -> b -> c并将其转换为(a, b) -> c

uncurry h . f