有时我有两种形式的功能:
f :: a -> (b1,b2)
h :: b1 -> b2 -> c
我需要作文g。我通过将 h 更改为 h' 来解决这个问题:
h' :: (b1,b2) -> c
你能告诉我(如果可能的话)一个函数 m,这样:
(h . m . f) == (h' . f)
或者另一种处理这种情况的方法。谢谢。
有时我有两种形式的功能:
f :: a -> (b1,b2)
h :: b1 -> b2 -> c
我需要作文g。我通过将 h 更改为 h' 来解决这个问题:
h' :: (b1,b2) -> c
你能告诉我(如果可能的话)一个函数 m,这样:
(h . m . f) == (h' . f)
或者另一种处理这种情况的方法。谢谢。
您要做的是获取一个对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
我认为。
你想做的是uncurry h
。此函数a -> b -> c
将其转换为(a, b) -> c
.
不咖喱 h . F