Однією з головних проблем при програмуванні традиційних мов, таких як C, Java, C #, ассемблер тощо, є те, що у вас незграбна послідовність кроків, які ви повинні виконати, щоб виконати задане завдання, оскільки для початку вам потрібно підготувати всі залежності і Їхні залежності раніше
Приклад: для того, щоб зробити A, у вас повинні бути присутні B і C, а B залежить від D і E, в результаті чого виходить щось на зразок
тому що ви повинні мати готові інгредієнти, перш ніж їх використовувати.
Функціональні мови, особливо ледачі, перевертають цю з ніг на голову. Якщо дозволити A сказати, що йому потрібні B і C, і дозволити мові виконання часу визначати, коли отримати B і C (що, у свою чергу, вимагає D і E), які всі оцінюються, коли потрібно оцінити A, ви можете створити дуже малі і стислі будівельні блоки, в результаті яких утворюються невеликі і стислі програми. Ледачі мови також дозволяють використовувати нескінченні списки, оскільки обчислюються лише фактично використовувані елементи, і не потрібно зберігати всю структуру даних в пам'яті, перш ніж мати можливість її використовувати.
Справді приємна хитрість полягає в тому, що цей автоматичний механізм "о, мені потрібні B і C" є масштабованим, оскільки немає обмежень - як у послідовній програмі - щодо того, де і коли це може відбутися, так що це може статися на в той же час і навіть на різних процесорах чи комп’ютерах.
Ось чому функціональні мови цікаві - адже механізм "що робити, коли" переймається системою виконання, на відміну від програміста, який повинен це робити вручну. Це настільки ж важлива відмінність, що автоматичне збирання сміття було для Java на C, і одна з головних причин, чому простіше писати надійне, масштабоване багатопотокове програмне забезпечення на Java, ніж на C. Це навіть простіше писати надійно, масштабоване багатопотокове програмне забезпечення на функціональних мовах ...