È stato detto che Javascript supporta alcune funzioni di ordine superiore, tra cui an essay from Joel Spolsky. Mark Jason Dominus ha scritto un intero libro chiamato Higher–Order Perl; la fonte del libro è disponibile per il download gratuito in una varietà di formati eccellenti, incluso PDF.
Fin da almeno 3 Perl, Perl ha supportato una funzionalità più simile a Lisp che a C, ma non è stato fino a Perl 5 che il supporto completo per le chiusure e tutto ciò che ne consegue era disponibile. E nessuna delle prime implementazioni di Perl 6 è stata scritta in Haskell, che ha avuto molta influenza su come il design di quella lingua è progredito.
esempi di approcci di programmazione funzionale in Perl appaiono nella programmazione di tutti i giorni, soprattutto con map
e grep
:
@ARGV = map { /\.gz$/ ? "gzip -dc < $_ |" : $_ } @ARGV;
@unempty = grep { defined && length } @many;
Dal sort
ammette anche una chiusura, il modello map/sort/map
è super comune:
@txtfiles = map { $_->[1] }
sort {
$b->[0] <=> $a->[0]
||
lc $a->[1] cmp lc $b->[1]
||
$b->[1] cmp $a->[1]
}
map { -s => $_ }
grep { -f && -T }
glob("/etc/*");
o
@sorted_lines = map { $_->[0] }
sort {
$a->[4] <=> $b->[4]
||
$a->[-1] cmp $b->[-1]
||
$a->[3] <=> $b->[3]
||
...
}
map { [$_ => reverse split /:/] } @lines;
La funzione reduce
rende lista hackery facile senza looping:
$sum = reduce { $a + $b } @numbers;
$max = reduce { $a > $b ? $a : $b } $MININT, @numbers;
C'è molto più di questo, ma questo è solo un assaggio. Le chiusure facilitano la creazione di generatori di funzioni, scrivendo le proprie funzioni di ordine superiore, non solo usando i builtin. In effetti, uno dei modelli di eccezione più comuni,
try {
something();
} catch {
oh_drat();
};
è non un built-in. Tuttavia, è quasi banale definire con try
una funzione che accetta due argomenti: una chiusura nel primo argomento e una funzione che richiede una chiusura nel secondo.
Perl 5 non ha integrato il curriculum, sebbene esista un modulo per questo. Perl 6, tuttavia, ha continui curricula e continuazioni di prima classe, oltre a molto altro ancora.
... che dire di 'forM'? :) – hvr
Bene, le monadi seguono, e poi seguono le funzioni di ordine superiore sulle monadi. Sono tutte le tartarughe! –
Risposta molto bella. Alcune delle "strutture di controllo" che le persone hanno escogitato sono piuttosto non convenzionali ma spettacolarmente utili. Un grande esempio che mi viene in mente è 'quickCheck' - un operatore di controllo che esegue la funzione fornita più volte con input arbitrari che tentano di farlo fallire. È un concetto così semplice, e le funzioni di ordine superiore (e le classi di tipi) lo rendono altrettanto semplice da usare. Solo 'quickCheck $ \ n xs -> length (take n xs) <= n' e guarda (che è falso, BTW, per negativo' n' - una facile svista da fare, ma quickCheck lo cattura facilmente). – mokus