tutorial - haskell simbolos
¿Por qué Haskell tiene una "identificación invertida" de este tipo? (1)
La función id
tiene este tipo:
id :: a -> a
Obtiene una instancia de este tipo, cuando reemplaza a
por a -> b
:
id :: (a -> b) -> (a -> b)
que, debido al currying, es lo mismo que:
id :: (a -> b) -> a -> b
Ahora aplique flip
a esto y obtendrá:
flip id :: a -> (a -> b) -> b
En el caso de id (+)
la instancia es:
id :: (Num a) => (a -> a) -> (a -> a)
Ahora la flip id
invertida te da:
flip id :: (Num a) => a -> (a -> a) -> a
Nota al margen: Esto también le muestra cómo ($)
es lo mismo que id
, solo que con un tipo más restringido:
($) :: (a -> b) -> a -> b
($) f x = f x
-- unpoint:
($) f = f
-- hence:
($) = id
Tengo curiosidad acerca de la expresión flip id
(No es tarea: lo encontré en la documentación de getOpt
).
Me pregunto por qué tiene este tipo:
Prelude> :t (flip id)
(flip id) :: b -> (b -> c) -> c
Por ejemplo, (flip id) 5 (+6)
da 11
.
Sé por qué id (+6) 5
da 11, pero no "entiendo" el flip id
del flip id
.
Traté de resolver esto usando lápiz y papel, pero no pude. ¿Alguien podría explicarme esto? Quiero decir, ¿cómo puede tener el tipo b -> (b -> c) -> c
?