Ci sono due punti chiave sull'applicazione parziale. Il primo è sintattico / pratico: alcune definizioni diventano più semplici e più brevi da leggere e scrivere, come menzionato da @jk. (Consulta Programmazione senza punti per ulteriori informazioni su quanto è fantastico!)
Il secondo, come citato @telastyn, riguarda un modello di funzioni e non è semplicemente conveniente. Nella versione Haskell, da cui otterrò i miei esempi perché non ho familiarità con altri linguaggi con un'applicazione parziale, tutte le funzioni richiedono un singolo argomento. Sì, anche funzioni come:
(:) :: a -> [a] -> [a]
prendi un singolo argomento; a causa dell'associatività del tipo di funzione costruttore ->
, quanto sopra è equivalente a:
(:) :: a -> ([a] -> [a])
che è una funzione che accetta a
e restituisce una funzione [a] -> [a]
.
Questo ci permette di scrivere funzioni come:
($) :: (a -> b) -> a -> b
che può applicare la funzione qualsiasi a un argomento del tipo appropriato. Anche pazzi come:
f :: (t, t1) -> t -> t1 -> (t2 -> t3 -> (t, t1)) -> t2 -> t3 -> [(t, t1)]
f q r s t u v = q : (r, s) : [t u v]
f' :: () -> Char -> (t2 -> t3 -> ((), Char)) -> t2 -> t3 -> [((), Char)]
f' = f $ ((), 'a') -- <== works fine
Ok, quindi è stato un esempio forzato. Ma uno più utile riguarda la classe Applicative , che include questo metodo:
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Come puoi vedere, il tipo è identico a $
se togli il Applicative f
bit, e in effetti questa classe descrive l'applicazione di funzione in un contesto. Quindi, invece della normale applicazione di funzione:
ghci> map (+3) [1..5]
[4,5,6,7,8]
Possiamo applicare le funzioni in un contesto Applicativo; ad esempio, nel contesto di Maybe in cui qualcosa può essere presente o mancante:
ghci> Just map <*> Just (+3) <*> Just [1..5]
Just [4,5,6,7,8]
ghci> Just map <*> Nothing <*> Just [1..5]
Nothing
Ora la parte veramente interessante è che la classe di tipo Applicative non menziona qualsiasi sulle funzioni di più di un argomento - tuttavia, può gestirle, anche funzioni di 6 argomenti come f
:
fA' :: Maybe (() -> Char -> (t2 -> t3 -> ((), Char)) -> t2 -> t3 -> [((), Char)])
fA' = Just f <*> Just ((), 'a')
Per quanto ne so, la classe di tipo Applicativo nella sua forma generale non sarebbe possibile senza una certa concezione dell'applicazione parziale. (Per eventuali esperti di programmazione là fuori - per favore correggimi se sbaglio!) Naturalmente, se la tua lingua manca di un'applicazione parziale, potresti costruirla in qualche modo, ma ... è non è lo stesso, vero? :)