Было время, когда функциональные языки котировались если не больше, то наравне с императивными. Время прошло и даже известно почему. Почему-то считается, что программирование на функциональном языке это «взрыв мозга». Не спорю, иногда действительно взрыв, но это буквально дружеский хлопок по ушам, по сравнению с взрывами мозга, которые мне периодически приходится испытывать разбираясь в чужих исходниках на C#. Я очень хочу, что бы история была спиралевидной (-:
Божественный Язык Математики™
Как-то так у человечества получилось, что все существующие методики программирования придумали математики. Может быть и странно, но вполне объяснимо, а большинство основополагающих, базовых, несущих шаблонов программирования либо процедурные, либо функциональные. Ооп придумали для облегчения создания Больших И Сложных систем. И если смотреть на ооп теоретически — действительно, очень удобно. Это удобство рушится, когда возникает необходимость использования сторонних библиотек (а она всегда возникает). Большое счастье, если создатели были хорошими и чуткими людьми, пожалели ваши нервы и многократно прогнали свой код через Unit-тесты, да еще снабдили всё это хозяйство логичной и понятной иерархичностью. Если они этого не сделали, код становится нечитабельным совершенно. У «эзотерических лиспов» с этим дела обстоят значительно лучше. Всё, что вам нужно знать — имя библиотечной функции, её параметры и что она даёт на выходе. Отлаживать такую систему намного проще (в том числе за счет отсутствия сайд-эффектов).
Миф о нечитабельности и эзотеричности ФП языков основан на разнице в восприятии кода программистами. Упор в императивных языках делается и на «человеческое, последовательное восприятие» кода. Например:
Функциональные языки, как ни странно, нисколько не менее читабельны. Просто в них описывается не процесс, а решение, результат.
Вот например, функция переворачивающей список (Erlang):
Она трудна для восприятия нетренированным взглядом, за счёт своей рекурсивной природы, но если немножкопринять на грудь приглядеться, можно понять, что здесь прямым текстом написано следующее: «Ко мне пришел список. Он мне не нравится, я хочу его перевернуть. Мне нравится хвост. Я его оставлю себе, а остальное склею и отложу. А если хвост вдруг кончился, значит я перевернул список и можно его выбросить».
Периодически очень трудно понять, а где, собственно, происходит действие? По-моему это великий Дзен, уметь писать программы, которые работают за счёт определений.
Божественный Язык Математики™
Как-то так у человечества получилось, что все существующие методики программирования придумали математики. Может быть и странно, но вполне объяснимо, а большинство основополагающих, базовых, несущих шаблонов программирования либо процедурные, либо функциональные. Ооп придумали для облегчения создания Больших И Сложных систем. И если смотреть на ооп теоретически — действительно, очень удобно. Это удобство рушится, когда возникает необходимость использования сторонних библиотек (а она всегда возникает). Большое счастье, если создатели были хорошими и чуткими людьми, пожалели ваши нервы и многократно прогнали свой код через Unit-тесты, да еще снабдили всё это хозяйство логичной и понятной иерархичностью. Если они этого не сделали, код становится нечитабельным совершенно. У «эзотерических лиспов» с этим дела обстоят значительно лучше. Всё, что вам нужно знать — имя библиотечной функции, её параметры и что она даёт на выходе. Отлаживать такую систему намного проще (в том числе за счет отсутствия сайд-эффектов).
Миф о нечитабельности и эзотеричности ФП языков основан на разнице в восприятии кода программистами. Упор в императивных языках делается и на «человеческое, последовательное восприятие» кода. Например:
int life() { // начнём human Peter = new human(); // Петя, пожалуйста родись storage shelf = new storage(); // Полка, пожалуйста появись Peter.Status = "Something good"; // Петя, ты молодец Peter.getPie(shelf); // Возьми пирожок с полки return 0; // У нас тут все хорошо, мы закончили, всем спасибо } // закончим
Функциональные языки, как ни странно, нисколько не менее читабельны. Просто в них описывается не процесс, а решение, результат.
Вот например, функция переворачивающей список (Erlang):
reverse(List) -> reverse(List,[]). reverse([Head | Tail], ResultList) -> reverse(Tail, [Head | ResultList]); reverse([], ResultList) -> ResultList.
Она трудна для восприятия нетренированным взглядом, за счёт своей рекурсивной природы, но если немножко
Периодически очень трудно понять, а где, собственно, происходит действие? По-моему это великий Дзен, уметь писать программы, которые работают за счёт определений.