2012-01-24 21 views

Respuesta

12

curry es lo incorrecto de usar aquí; convierte una función que funciona en tuplas en una función curried. Desea que el opuesto, que es uncurry:

uncurry :: (a -> b -> c) -> (a, b) -> c 

En este caso, es uncurry (<).

(Otra fuente útil para combinadores útiles en la escritura de funciones en tuplas es Control.Arrow; ya (->) es una instancia de Arrow, se puede leer a b c como b -> c.)

1

En cuanto a los tipos es la mejor manera en Haskell a obtener la primera idea, lo que hace cualquier función:

curry :: ((a, b) -> c) -> a -> b -> c 
uncurry :: (a -> b -> c) -> (a, b) -> c 

curry: función del par → función de curry (que curries una función).

uncurry: curried function → function of pair.

Haskell Wiki page on currying tiene pequeños ejercicios al final de la página:

  • Simplificar curry id
  • Simplificar uncurry const
  • expreso snd usando curry o uncurry y otras funciones básicas preludio y sin lambdas
  • Escriba la función \(x,y) -> (y,x) sin lambda y wi th solo funciones Preludio

Trate de resolver estos ejercicios en este momento, le darán una visión masiva del sistema de tipo Haskell y la aplicación de funciones.

Hay varias aplicaciones interesantes de uncurry, tratar de pasar argumentos diferentes a las funciones siguientes y ver lo que hacen:

uncurry (.) :: (b -> c, a -> b) -> a -> c 
uncurry (flip .) :: (b -> a -> b1 -> c, b) -> b1 -> a -> c 
uncurry (flip (.)) :: (a -> b, b -> c) -> a -> c 
uncurry ($) :: (b -> c, b) -> c 
uncurry (flip ($)) :: (a, a -> c) -> c 

-- uncurry (,) is an identity function for pairs 
uncurry (,) :: (a, b) -> (a, b) 
uncurry (,) (1,2) -- returns (1,2) 
uncurry uncurry :: (a -> b -> c, (a, b)) -> c 
uncurry uncurry ((+), (2, 3)) -- returns 5 

-- curry . uncurry and uncurry . curry are identity functions 
curry . uncurry :: (a -> b -> c) -> (a -> b -> c) 
(curry . uncurry) (+) 2 3 -- returns 5 
uncurry . curry :: ((a, b) -> c) -> ((a, b) -> c) 
(uncurry . curry) fst (2,3) -- returns 2 

-- pair -> triple 
uncurry (,,) :: (a, b) -> c -> (a, b, c) 
uncurry (,,) (1,2) 3 -- returns (1,2,3)