Si ottengono istanze di quelle che vengono chiamate frecce statiche (vedere "Programmazione applicativa con effetti" di Conor McBride et al.) Gratuitamente dal pacchetto Control.Applicative
. Pertanto, qualsiasi tipo di origine, nel tuo caso Char
, genera un'istanza Applicativa in cui qualsiasi altro tipo a
viene associato al tipo Char -> a
.
Quando si combinano uno di questi, dicono applicare una funzione f :: Char -> a -> b
ad un valore x :: Char -> a
, la semantica è che si crea una nuova funzione Char -> b
, che andranno ad alimentare il suo argomento in entrambi f
e x
in questo modo,
f <*> x = \c -> (f c) (x c)
Quindi, come fai notare, questo rende il vostro esempio, equivale a
isAlphaNum c = (isAlpha c) || (isNum c)
a mio parere, tale sforzo non è sempre necessario, e sarebbe aspetto molto più gradevole se Haskell avesse un supporto sintattico migliore per gli applicativi (forse qualcosa come i linguaggi a 2 livelli).
'isAlphaNum' ==' (\ c-> ((||) .isAlpha) c (isNum c)) '==' (\ c-> isAlpha c || isNum c) '(... solo un sidenote). –