Lo que estás buscando que hacer es tomar una función que opera sobre curry argumentos, h
, y aplicarlo al resultado de f
, que es una tupla. Este proceso, al convertir una función de dos argumentos en una función que toma un argumento que es una tupla, se llama que se deshace de. Tenemos, desde 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.
Así que ahora podemos escribir:
f :: a -> (b,c)
f = undefined
h :: b -> c -> d
h = undefined
k :: a -> d
k = uncurry h . f
Otra forma difícil de pensar en esto es a través de un funtor aplicativo,
k = (h <$> fst <*> snd) . f
Idea de Conor McBride, quien lo escribiría como: (|f fst snd|) . f
, creo.
¿Hay una función (b1, b2) -> b1 -> b2? – Marcin
Detener ... Hoogle tiempo! [(a -> b -> c) -> ((a, b) -> c)] (http://haskell.org/hoogle/?hoogle=%28a+-%3E+b+-%3E+c% 29 + -% 3E +% 28% 28a% 2Cb% 29 + -% 3E + c% 29) (Transforma la función curried con 2 argumentos en una función que toma una tupla) –