domingo, 18 de octubre de 2020

Currying en Haskell


Si tenemos esta firma de función :

    f :: X -> Y -> Z -> A

La flecha "->" es asociativa a la derecha, por lo que es lo mismo que:

    f :: X -> (Y -> (Z -> A))

Lo que esto significa es que podemos considerar f como una función con un solo argumento de tipo X que devuelve una función de tipo Y-> Z-> A.

La técnica de reescribir una función de múltiples argumentos en una secuencia de funciones con un solo argumento se llama currización. Podemos ilustrar esto mejor usando una función lambda:

    \ x y z -> ...

    \ x -> (\ y z -> ...)

    \ x -> (\ y -> (\ z -> ...))


El nombre "curry", es una referencia al lógico Haskell Curry. El concepto en realidad fue propuesto originalmente por otro lógico, Moses Schönfinkel, pero su nombre no era tan pegadizo.

La aplicación parcial significa que no necesitamos proporcionar todos los argumentos a una función, para aplicar la función.  Por ejemplo, dado

     sq x y = x*x+y*y

Observamos que la aplicación de la función se asocia a la izquierda, por lo que se cumple la siguiente equivalencia


    sq x y = (sq x) y

Por tanto, podemos crear una función especializada mediante la aplicación parcial de x:

    sq4 = sq 4 -- = \y -> 16+y*y

    sq4 3 -- = (sq 4) 3 = sq 4 3 = 25

Es por eso que puedes escribir cosas como:

    dobles = mapa (* 2) [1 ..]

No hay comentarios.:

Publicar un comentario