结合两个curried函数

Dmi*_*tsa 1 haskell higher-order-functions

假设我们有两个类型的函数(a -> b -> c).我希望有一个单一的功能,其中,当应用于ab将给予d,从合并c由一个特定的功能(c -> c -> d).我用箭头想出了这个解决方案:

combine :: (a -> b -> c) -> (a -> b -> c) -> (c -> c -> d) -> (a -> b -> d)
combine f g op = ((uncurry op) .) . (uncurry (&&&)) . (f &&& g)
Run Code Online (Sandbox Code Playgroud)

有没有办法以更优雅的方式做到这一点,或者将其概括为适用于更大的功能(例如(a -> b -> c -> d) -> (a -> b -> c -> d) -> (d -> d -> e) -> (a -> b -> c -> e))?

Cla*_*diu 7

不要害怕明白.对我来说,这更容易阅读:

combine :: (a -> b -> c) -> (a -> b -> c) -> (c -> c -> d) -> (a -> b -> d)
combine f g op = \a b -> op (f a b) (g a b)
Run Code Online (Sandbox Code Playgroud)

对于更多的灵魂来说,看起来不是更丑陋:

combine3 f g op = \a b c -> op (f a b c) (g a b c)
Run Code Online (Sandbox Code Playgroud)