Haskell Hero

Haskell Hero es un manual interactivo del lenguaje Haskell para principiantes.

Lambdas

¿Por qué expresiones con lambdas?

Ejemplo

Definid una función aumentaLista :: [Integer] -> [Integer] que toma como parámetros una lista de números enteros, multiplica todos los números por dos y suma cinco a ellos.

aumentaLista [1,2,5]  ~>*  [1*2+5, 2*2+5, 5*2+5]  ~>*  [7,9,15]


Lo más fácil es usar la función map que toma como su primer parámetro una función que multiplica su parámetro por dos y suma cinco a él. Definamos entonces esta función auxiliar:

aumenta   ::  Integer -> Integer
aumenta x  =  x*2+5

Después ya podemos definir la función aumentaLista:
aumentaLista   ::  [Integer] -> [Integer]
aumentaLista s  =  map aumenta s

Y ya está. Sin embargo, si no necesitaramos la función aumenta para nada más, es bastante inútil definirla de esta manera. Lo que pasa es que podemos usar funciones anónimas.

Expresiones con lambdas

Solemos usar expresiones con lambdas cuando necesitamos definir una función rápido y la vamos a usar una sola vez. Por ejemplo una función que multiplica su parámetro por dos se podría definir de manera siguiente:

\x -> 2 * x

Esta es una función unaria anónima que toma un número y devuelve su doble. En otras palabras "Toma x y conviértelo en 2 * x".

Una función binaria que toma dos números y los suma se puede definir por ejemplo así:

\x y -> x + y

En otras palabras "Toma x y y y conviértelos en x + y."

Ejemplos de evaluación:

(\x -> 2 * x)   5    ~>  2 * 5  ~>  10
(\x y -> x + y) 3 5  ~>  3 + 5  ~>  8

La función del parráfo anterior puede entonces definirse por medio de una función anónima de esta manera:

aumentaLista   ::  [Integer] -> [Integer]
aumentaLista s  =  map (\x -> x*2+5) s


Por medio de una lambda podemos también definir las funciones curry y uncurry.

curry   g  =  \x y   -> g (x,y)
uncurry f  =  \(x,y) -> f x y

En esta notación se puede ver bien de que manera se usan las dos funciones a menudo. Por ejemplo podemos definir la función fst por medio de la función const y al revés.
fst    =  uncurry const
const  =  curry fst