Это пример , который убедил меня , чтобы узнать Haskell (и мальчик я рад , что я и сделал).
-- 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
Хорошо, это короткая, читаемая программа. В этом смысле это лучше, чем программа на C. Но чем это так отличается от (скажем) программы на Python с очень похожей структурой?
Ответ - ленивая оценка. В большинстве языков (даже в некоторых функциональных) программа со структурой, подобной приведенной выше, приведет к тому, что весь файл будет загружен в память, а затем снова записан под новым именем.
Haskell «ленив». Он не вычисляет вещи до тех пор, пока это не нужно, и, соответственно , не вычисляет вещи, которые ему никогда не нужны. Например, если бы вы удалили writeFile
строку, Haskell вообще не стал бы читать что-либо из файла.
Как бы то ни было, Haskell понимает, что это writeFile
зависит от класса readFile
, и поэтому может оптимизировать этот путь к данным.
Хотя результаты зависят от компилятора, при запуске вышеуказанной программы обычно происходит следующее: программа считывает блок (скажем, 8 КБ) первого файла, затем записывает его во второй файл, а затем считывает другой блок из первого файла. файл и записывает его во второй файл и так далее. (Попробуйте запустить strace
его!)
... что очень похоже на то, что делает эффективная реализация копии файла на языке C.
Итак, Haskell позволяет писать компактные, читаемые программы - часто без большого ущерба для производительности.
Еще я должен добавить, что Haskell просто затрудняет написание программ с ошибками. Удивительная система типов, отсутствие побочных эффектов и, конечно же, компактность кода Haskell сокращают количество ошибок как минимум по трем причинам:
Лучший дизайн программы. Снижение сложности приводит к меньшему количеству логических ошибок.
Компактный код. Меньше строк для ошибок.
Ошибки компиляции. Многие ошибки просто недопустимы для Haskell .
Haskell не для всех. Но каждый должен попробовать.