To przykład, który przekonał mnie, aby dowiedzieć się, Haskell (chłopiec i jestem zadowolony, zrobiłem).
-- 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, to krótki, czytelny program. W tym sensie jest lepszy niż program w C. Ale czym to się tak różni od (powiedzmy) programu w Pythonie o bardzo podobnej strukturze?
Odpowiedź to leniwa ocena. W większości języków (nawet niektórych funkcjonalnych) program o strukturze podobnej do powyższego spowodowałby załadowanie całego pliku do pamięci, a następnie ponowne zapisanie pod nową nazwą.
Haskell jest „leniwy”. Nie oblicza rzeczy, dopóki nie musi, a co za tym idzie , nie oblicza rzeczy, których nigdy nie potrzebuje. Na przykład, gdybyś usunął tę writeFile
linię, Haskell nie zawracałby sobie głowy czytaniem czegokolwiek z pliku.
W obecnej sytuacji Haskell zdaje sobie sprawę, że writeFile
zależy od readFile
, więc jest w stanie zoptymalizować tę ścieżkę danych.
Chociaż wyniki są zależne od kompilatora, to zwykle dzieje się po uruchomieniu powyższego programu: program wczytuje blok (powiedzmy 8KB) pierwszego pliku, następnie zapisuje go w drugim pliku, a następnie odczytuje kolejny blok z pierwszego plik i zapisuje go w drugim pliku i tak dalej. (Spróbuj strace
na nim biegać !)
... co wygląda bardzo podobnie do tego, co zrobiłaby wydajna implementacja kopii pliku w C.
Tak więc Haskell umożliwia pisanie zwartych, czytelnych programów - często bez poświęcania dużej wydajności.
Kolejną rzeczą, którą muszę dodać, jest to, że Haskell po prostu utrudnia pisanie błędnych programów. Niesamowity system typów, brak efektów ubocznych i oczywiście zwartość kodu Haskell redukuje błędy z co najmniej trzech powodów:
Lepszy projekt programu. Mniejsza złożoność prowadzi do mniejszej liczby błędów logicznych.
Kompaktowy kod. Mniej wierszy, w których mogą występować błędy.
Błędy kompilacji. Wiele błędów po prostu nie jest poprawnych Haskell .
Haskell nie jest dla każdego. Ale każdy powinien spróbować.