Це той приклад, який переконав мене навчитися 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 з дуже подібною структурою?
Відповідь - лінива оцінка. У більшості мов (навіть у деяких функціональних) програма, структурована на зразок вище, призведе до того, що весь файл завантажується в пам'ять, а потім знову виписується під новою назвою.
Хаскелл "ледачий". Він не обчислює речі, поки цього не потрібно, а розширення не обчислює речі, які йому ніколи не потрібні. Наприклад, якби ви видалили writeFile
рядок, Haskell не перешкоджав би читання нічого з файлу в першу чергу.
В даний час Haskell розуміє, що це writeFile
залежить від readFile
, і тому здатний оптимізувати цей шлях даних.
Хоча результати залежать від компілятора, що, як правило, відбудеться при запуску вищевказаної програми, це таке: програма зчитує блок (скажімо, 8 КБ) першого файлу, потім записує його у другий файл, потім читає ще один блок з першого файл, і записує його у другий файл тощо. (Спробуйте запустити strace
його!)
... що дуже схоже на те, що дозволить зробити ефективна C-версія копії файлів.
Отже, Haskell дозволяє писати компактні, читаються програми - часто, не приносячи великої продуктивності.
Ще одне, що я мушу додати, це те, що Haskell просто ускладнює написання програм-баггі. Дивовижна система типу, відсутність побічних ефектів і, звичайно, компактність коду Haskell зменшує помилки як мінімум з трьох причин:
Кращий дизайн програми. Знижена складність призводить до меншої кількості логічних помилок.
Компактний код. Менш рядків для помилок існує.
Помилки компіляції. Багато помилок просто не дійсні Haskell .
Haskell не для всіх. Але всі повинні спробувати.