Lo que Pelotom y Chuck dijeron es 100% correcto. Creo que en algún momento te confundiste un poco acerca de las definiciones de Curry vs Uncurry y Function.
Sabemos que una función al curry es una como:
add x y = x + y
Se sería definición:
add :: (Num a) => a -> a -> a
Agregar toma una Num
, y devuelve una función que toma un Num
y retu rns a Num
.
Al tener de esta manera, podemos obtener una aplica parcialmente función, como
add3 = add 3
Gracias a add
siendo al curry, cuando podemos pasar un solo parámetro (en este caso, 3) , podemos recuperar una función que toma un Num
y devuelve un Num
.
>add3 5
8
funciones Uncurried toma tuplas, o valores agrupados juntos, como (1,2). (Tenga en cuenta que las tuplas no tienen pares. Puede tener una tupla de la forma de (1,2,3,4,5).Solo ofertas regulares y poco frecuentes con pares específicamente). Si cambiamos nuestro añadir a ser uncurried, sería:
add :: (Num t) => (t, t) -> t
add (x, y) = x + y
que toma una tupla de dos Num
s y devuelve un Num. No podemos aplicarlo parcialmente como lo hicimos con add como función curried. Necesita ambos parámetros, pasados en una tupla.
¡Ahora, en la función de descabezar! (Si desea conocer el tipo de una función, use :t <some function>
en GHCi, o use Hoogle).
uncurry :: (a -> b -> c) -> ((a, b) -> c)
uncurry f=\(a,b)->f a b
Entonces, ¿qué sabemos de esto? Se necesita f, que observamos en la definición es una función curried de (a-> b-> c), y devuelve función no ejecutada ((a, b) -> c).
Si alimentamos uncurry nuestro curried add (recuerde: add x y
), ¿qué obtenemos?
obtenemos una función anónima o función lambda, que toma una tupla, y aplica los valores de la tupla, y a
b
, a nuestra función, add
.
f a b
no significa que obtenemos una función: verá un ->
si ese fuera el caso. Acabamos de obtener el valor de f
con a
y b
.
Es algo así como si lo hiciéramos esto a mano:
tupleAdd (a,b) = add a b
Pero uncurry
significa todo para nosotros, y que sólo puede continuar a lo largo de nuestra marca nueva forma uncurried de nuestra función originalmente al curry.
Cool, hunh?