2012-09-09 15 views
37

Tengo curiosidad acerca de la expresión flip id (No es tarea: lo encontré en la documentación getOpt).¿Por qué Haskell tiene el "tirón de identificación" tiene este tipo?

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" lo de flip id.

Traté de resolver esto usando lápiz y papel pero no pude. ¿Alguien podría explicarme esto? Quiero decir, ¿cómo el flip id viene a tener el tipo b -> (b -> c) -> c?

Respuesta

66

La función id tiene este tipo:

id :: a -> a 

de obtener una instancia de este tipo, cuando se reemplaza a por a -> b:

id :: (a -> b) -> (a -> b) 

que, debido a currying, es el mismo que :

id :: (a -> b) -> a -> b 

Ahora aplique flip a esto y que se obtiene:

flip id :: a -> (a -> b) -> b 

En el caso de id (+) la instancia es:

id :: (Num a) => (a -> a) -> (a -> a) 

Ahora flip id le da: Nota

flip id :: (Num a) => a -> (a -> a) -> a 

lateral: Esto también muestra cómo hacerlo ($) 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 
+11

Oye, ertes, pareces tener [otra cuenta] (http://stackoverflow.com/users/1488832/ertes), las cuales no están registradas. Si registra su cuenta, puede [combinarlos] (http://meta.stackexchange.com/questions/18232/how-can-one-link-merge-combine-associate-two-accounts-users-anonymous-unregist) y luego tener una sola cuenta para todas sus respuestas (¡que son realmente buenas, por cierto!). – huon

+0

Gracias, gran respuesta. Su mención de '$' hace que sea más intuitivo de entender y me alegra que no lo haya dejado. Le tomará a mi cerebro unos días más entender completamente tu respuesta. –

+3

Buena respuesta. Pensar en 'flip id' como' flip ($) 'ayuda mucho. – Garrett

Cuestiones relacionadas