有时我有两种形式的功能:
f :: a -> (b1,b2)
h :: b1 -> b2 -> c
我需要组合物g。我通过将h改为h':
来解决这个问题h' :: (b1,b2) -> c
你能告诉我(如果可能的话)一个函数m,以便:
(h . m . f) == (h' . f)
或另一种处理此类情况的方法。感谢。
答案 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