Obtiene instancias de las llamadas flechas estáticas (consulte "Programación aplicable con efectos" por Conor McBride y otros) gratis desde el paquete Control.Applicative
. Por lo tanto, cualquier tipo de fuente, en su caso Char
, da lugar a una instancia Aplicable donde cualquier otro tipo a
se mapea al tipo Char -> a
.
Al combinar cualquiera de estos, dicen aplica una función f :: Char -> a -> b
a un valor x :: Char -> a
, la semántica es que se crea una nueva función Char -> b
, que alimentarán su argumento en tanto f
y x
como tal,
f <*> x = \c -> (f c) (x c)
Por lo tanto, como usted señala, esto hace que su ejemplo equivalente a
isAlphaNum c = (isAlpha c) || (isNum c)
En mi opinión, estos esfuerzos no siempre es necesaria, y que se vería más bonito si Haskell tuviera un mejor soporte sintáctico para los aplicativos (tal vez algo así como los idiomas de 2 niveles).
'isAlphaNum' ==' (\ c-> ((||) .isAlpha) c (isNum c)) '==' (\ c-> isAlpha c || isNum c) '(... just una nota al margen). –