tipos - haskell para que sirve
¿Cuál es el significado de paréntesis en las firmas de tipo Haskell? (3)
Tome la firma de tipo de fmap
(el método Functor
) como ejemplo:
(a -> b) -> f a -> f b
¿En qué se diferencia de la siguiente firma de tipo?
a -> b -> f a -> f b
¿Hay incluso una diferencia entre esos dos tipos de firmas?
Sí,
(a -> b) -> ...
significa "dada una función que toma a a b ...". Mientras esto
a -> b -> ...
significa "dado algunos a y algunos b ..."
Sí, el (a -> b)
significa un argumento que es una función con la firma a -> b
, mientras que a -> b -> ...
significa dos argumentos.
Sí, hay una diferencia, porque el constructor de tipo ->
es asociativo a la derecha . En otras palabras,
a -> b -> f a -> f b
es equivalente a
a -> (b -> (f a -> f b))
Esta firma de tipo denota una función que toma un parámetro de tipo a
y devuelve una función, que a su vez toma un parámetro de tipo b
y devuelve una función, que toma un parámetro de tipo fa
y devuelve un valor de tipo fb
.
Por otra parte,
(a -> b) -> f a -> f b
denota una función que toma un parámetro de tipo a -> b
(es decir, una función que toma un parámetro de tipo a
y devuelve un valor de tipo b
) y devuelve una función, que a su vez toma un parámetro de tipo fa
y devuelve un valor de tipo fb
.
Aquí hay un ejemplo artificial que ilustra la diferencia entre las dos firmas de tipo:
f :: (Int -> Bool) -> [Int] -> [Bool]
f = map
g :: Int -> Bool -> [Int] -> [Bool]
g n b = map (/n'' -> (n'' == n) == b)
λ> let ns = [42, 13, 42, 17]
λ> f (== 42) ns
[True,False,True,False]
λ> g 42 True ns
[True,False,True,False]
λ> g 42 False ns
[False,True,False,True]