Questo è l' esempio che mi ha convinto a imparare Haskell (e ragazzo sono contento di averlo fatto).
-- program to copy a file --
import System.Environment
main = do
--read command-line arguments
[file1, file2] <- getArgs
--copy file contents
str <- readFile file1
writeFile file2 str
OK, è un programma breve e leggibile. In questo senso è meglio di un programma C. Ma come è così diverso da (diciamo) un programma Python con una struttura molto simile?
La risposta è una valutazione pigra. Nella maggior parte dei linguaggi (anche alcuni funzionali), un programma strutturato come quello sopra comporterebbe il caricamento dell'intero file in memoria, e quindi la riscrittura con un nuovo nome.
Haskell è "pigro". Non calcola le cose finché non ne ha bisogno, e per estensione non calcola le cose di cui non ha mai bisogno. Ad esempio, se dovessi rimuovere il filewriteFile
riga, Haskell non si preoccuperebbe di leggere nulla dal file in primo luogo.
Così com'è, Haskell si rende conto che writeFile
dipende dareadFile
, e quindi è in grado di ottimizzare questo percorso dati.
Mentre i risultati dipendono dal compilatore, ciò che accade tipicamente quando esegui il programma sopra è questo: il programma legge un blocco (diciamo 8KB) del primo file, quindi lo scrive nel secondo file, quindi legge un altro blocco dal primo file e lo scrive nel secondo file e così via. (Prova a correrestrace
sopra!)
... che assomiglia molto a ciò che farebbe l'implementazione efficiente in C di una copia di file.
Quindi, Haskell ti consente di scrivere programmi compatti e leggibili, spesso senza sacrificare molte prestazioni.
Un'altra cosa che devo aggiungere è che Haskell rende semplicemente difficile scrivere programmi difettosi. Lo straordinario sistema di tipi, la mancanza di effetti collaterali e, naturalmente, la compattezza del codice Haskell riducono i bug per almeno tre motivi:
Migliore progettazione del programma. La complessità ridotta porta a meno errori logici.
Codice compatto. Meno righe per la presenza di bug.
Errori di compilazione. Molti bug non sono validi Haskell .
Haskell non è per tutti. Ma tutti dovrebbero provarlo.