Sí, se llama flip :: (a -> b -> c) -> b -> a -> c
, p. Ej. flip (>) 3 5 == True
. Más información y fuente de pirateo: flip.
Lo que quiere es simplemente invertir los argumentos de la aplicación de función, ¿verdad? Bueno, ya que ($)
es una aplicación de función, al usar flip puede escribir flip ($) :: b -> (b -> c) -> c
. Veamos qué pasa. Esta es la fuente de las dos funciones de preludio:
-- from Hackage:
($) :: (a -> b) -> a -> b
f $ x = f x
-- from Hackage:
flip :: (a -> b -> c) -> b -> a -> c
flip f x y = f y x
Así que, básicamente, si usted junta los tipos, flip ($)
convierte
flip ($) ::
b -> -- type of x, argument of y and second argument of ($)
(b -> c) -> -- type of y, function applied by ($) as its first argument
c -> -- result of the application "y x"
Si sigue las definiciones actuales de las funciones:
flip ($) = (\f x y -> f y x) ($) -- from flip's def.
= \x y -> ($) y x -- partial application
= y x -- from ($)'s def.
Wow, eso me llevó unos 5 minutos con papel y bolígrafo para resolver cómo la firma 'a -> a' de un id podía de alguna manera mapear a' flip' esperando algo con 'a - > b -> c'. ¡Vale la pena investigar un poco! – Ashe
@Len: Se vuelve más claro una vez que se ve que cuando se aplica a las funciones, 'id' es lo mismo que' ($) ' –
¡Eso es muy cierto! El momento "a-ha" para mí fue darme cuenta de que debería ver 'a -> b -> c' como' a -> (b -> c) 'que es, y luego coincidiría con' id' s 'a' -> a'' y descubrió que 'a = a' = (b -> c) '- Estaba mirando demasiado las diferencias de aridad y no podía superarlo. – Ashe