Jednym z głównych problemów podczas programowania tradycyjnych języków, takich jak C, Java, C #, asembler itp., Jest trudna sekwencja kroków, które należy wykonać, aby wykonać dane zadanie, ponieważ najpierw trzeba przygotować wszystkie zależności i ICH zależności wcześniej
Przykład: aby wykonać A, musisz mieć obecne B i C, a B zależy od D i E, co daje coś w rodzaju
ponieważ musisz mieć przygotowane składniki, zanim będziesz mógł ich użyć.
Języki funkcjonalne, zwłaszcza leniwe, przewracają ten język do góry nogami. Pozwalając A powiedzieć, że potrzebuje B i C, i pozwolić środowisku uruchomieniowemu języka dowiedzieć się, kiedy uzyskać B i C (co z kolei wymaga D i E), które wszystkie są oceniane, gdy są potrzebne do oceny A, możesz stworzyć bardzo małe i zwięzłe bloki konstrukcyjne, które dają małe i zwięzłe programy. Leniwe języki pozwalają również na korzystanie z nieskończonych list, ponieważ obliczane są tylko faktycznie używane elementy i bez konieczności przechowywania całej struktury danych w pamięci przed użyciem.
Naprawdę fajna sztuczka polega na tym, że ten automatyczny mechanizm „och, potrzebuję B i C” jest skalowalny, ponieważ nie ma ograniczeń - jak w programie sekwencyjnym - co do tego, gdzie i kiedy ta ocena może się zdarzyć, więc może się zdarzyć na w tym samym czasie, a nawet na różnych procesorach lub komputerach.
Że dlatego Języki funkcjonalne są interesujące - bo «co zrobić, gdy» mechanizm zostaje przejęty przez system wykonawczego w przeciwieństwie do programatora posiadającego to zrobić ręcznie. Jest to tak ważna różnica, jak automatyczne odśmiecanie pamięci dla Javy do C, i jeden z głównych powodów, dla których łatwiej jest pisać solidne, skalowalne, wielowątkowe oprogramowanie w Javie niż w C. Jeszcze łatwiej jest pisać solidne, skalowalne oprogramowanie wielowątkowe w językach funkcjonalnych ...