Pull to refresh

Про ФП #2

Reading time2 min
Views1.3K
Было время, когда функциональные языки котировались если не больше, то наравне с императивными. Время прошло и даже известно почему. Почему-то считается, что программирование на функциональном языке это «взрыв мозга». Не спорю, иногда действительно взрыв, но это буквально дружеский хлопок по ушам, по сравнению с взрывами мозга, которые мне периодически приходится испытывать разбираясь в чужих исходниках на C#. Я очень хочу, что бы история была спиралевидной (-:

Божественный Язык Математики™

Как-то так у человечества получилось, что все существующие методики программирования придумали математики. Может быть и странно, но вполне объяснимо, а большинство основополагающих, базовых, несущих шаблонов программирования либо процедурные, либо функциональные. Ооп придумали для облегчения создания Больших И Сложных систем. И если смотреть на ооп теоретически — действительно, очень удобно. Это удобство рушится, когда возникает необходимость использования сторонних библиотек (а она всегда возникает). Большое счастье, если создатели были хорошими и чуткими людьми, пожалели ваши нервы и многократно прогнали свой код через 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.


Она трудна для восприятия нетренированным взглядом, за счёт своей рекурсивной природы, но если немножко принять на грудь приглядеться, можно понять, что здесь прямым текстом написано следующее: «Ко мне пришел список. Он мне не нравится, я хочу его перевернуть. Мне нравится хвост. Я его оставлю себе, а остальное склею и отложу. А если хвост вдруг кончился, значит я перевернул список и можно его выбросить».
Периодически очень трудно понять, а где, собственно, происходит действие? По-моему это великий Дзен, уметь писать программы, которые работают за счёт определений.
Tags:
Hubs:
Total votes 10: ↑5 and ↓50
Comments14

Articles