13

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

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

我需要作文g。我通过将 h 更改为 h' 来解决这个问题:

h' :: (b1,b2) -> c

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

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

或者另一种处理这种情况的方法。谢谢。

4

2 回答 2

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

来自 Conor McBride 的想法,他将其写成:(|f fst snd|) . f我认为。

于 2011-06-04T14:29:02.757 回答
9

你想做的是uncurry h。此函数a -> b -> c将其转换为(a, b) -> c.

不咖喱 h . F
于 2011-06-04T14:28:52.517 回答