Dies ist das Beispiel, das mich überzeugt hat, Haskell zu lernen (und Junge, bin ich froh, dass ich es getan habe).
-- 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, es ist ein kurzes, lesbares Programm. In diesem Sinne ist es besser als ein C-Programm. Aber wie unterscheidet sich das von einem Python-Programm mit einer sehr ähnlichen Struktur?
Die Antwort ist faule Bewertung. In den meisten Sprachen (auch in einigen funktionalen) würde ein Programm wie das oben beschriebene dazu führen, dass die gesamte Datei in den Speicher geladen und dann unter einem neuen Namen erneut ausgeschrieben wird.
Haskell ist "faul". Es berechnet keine Dinge, bis es benötigt wird, und im weiteren Sinne berechnet es keine Dinge, die es nie benötigt. Wenn Sie beispielsweise die writeFile
Zeile entfernen würden, würde Haskell sich überhaupt nicht darum kümmern, etwas aus der Datei zu lesen.
So wie es ist, erkennt Haskell, dass das writeFile
von dem abhängt readFile
, und kann so diesen Datenpfad optimieren.
Während die Ergebnisse vom Compiler abhängig sind, passiert normalerweise Folgendes, wenn Sie das obige Programm ausführen: Das Programm liest einen Block (z. B. 8 KB) der ersten Datei, schreibt ihn dann in die zweite Datei und liest dann einen weiteren Block aus der ersten Datei und schreibt es in die zweite Datei und so weiter. (Versuchen Sie es zu laufen strace
!)
... was sehr ähnlich aussieht wie die effiziente C-Implementierung einer Dateikopie.
Mit Haskell können Sie also kompakte, lesbare Programme schreiben - oft ohne viel Leistung zu verlieren.
Eine andere Sache, die ich hinzufügen muss, ist, dass Haskell es einfach schwierig macht, fehlerhafte Programme zu schreiben. Das erstaunliche Typsystem, das Fehlen von Nebenwirkungen und natürlich die Kompaktheit des Haskell-Codes reduzieren Fehler aus mindestens drei Gründen:
Besseres Programmdesign. Reduzierte Komplexität führt zu weniger Logikfehlern.
Kompakter Code. Es gibt weniger Zeilen, in denen Fehler vorhanden sind.
Fehler kompilieren. Viele Fehler sind einfach nicht gültig, Haskell .
Haskell ist nicht jedermanns Sache. Aber jeder sollte es versuchen.