2011-06-04 24 views
11

A veces tienen dos funciones de la forma:composición de funciones en Haskell con argumentos de tupla

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

y necesito la composición g. Resuelvo esto cambiando h a h ':

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

¿Me podría (si es posible) una función m mostrar, de manera que:

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

Otra forma de hacer frente a tales situaciones. Gracias.

+0

¿Hay una función (b1, b2) -> b1 -> b2? – Marcin

+2

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) –

Respuesta

14

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.

+0

Muchas gracias. Solo sabía fst y snd de Data.Tuple. – Jogusa

9

Lo que quieres hacer es uncurryh. Esta función toma a -> b -> c y la convierte en (a, b) -> c.

uncurry h . f
Cuestiones relacionadas