Функциональное программирование, свежий взгляд на вещи - 2.

Статья перемещена в тематический блог и доступна по новому адресу - ссылка.

6 коммент.:

  1. Прочитав статью, ясно, что автор не понимает суть функционального программирования, (цит. оставим одни переменные)в ФП переменных нет, сама парадигма переменных противоречит ФП.

    (цит. в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании)) как я представляю себе, императивное программирование это комбинация трех компонент 1. последовательное выполнение команд 2. ветвления 3. циклы которые согласно теории могут представить собой ЛЮБОЙ алгоритм.

    в ФП две базовые компоненты аппликация и функциональная абстракция.

    1 аппликация - это когда функция применяется к другим функциям,например, sqrt(sqr(A) + sqr(B))
    где + тоже функция, для понятности sqrt(sum(sqr(A),sqr(B)))

    2. функциональная абстракция что то типа такого, f1(x)=f0(sin(x)) будет эквивалентно f2(t)=f0(t) где t это sin(x)


    эти две компоненты являются аналогичной базой ФП как и выше названые три - императивного программирования.

    строго научно доказано что количество алгоритмов которые можно реализовать на ФП совпадает с множеством алгоритмов ИП. Хотя код программы будет, конечно, существенно отличатся
    результат будет тот же.

    примеч. рекурсия это частный случай аппликации когда функция применяется сама к себе. Теория рекурсивных функций позволяет создавать мощные алгоритмические решения, поэтому несмотря на то что в императивных (обычных) языках есть циклы её все равно юзают на С++ или на чём вы там программируете. вспомните задачу про восемь ферзей.

    добавлю ещё Erlang к вашему списку языков ФП
    Erlang аппликативный, СТРОГИЙ функциональный язык паралельного программирования с АНТИ-объектной парадигмой программирования. И не смотря на это он ещё где то даже используется:)
    facebook, amazon.com

    Это не мелкософтовский F#, не перекачаный стероидами Haskell, и не дедовский Lisp, а довольно оригинальная разработка.

    _________________________________________
    в общем ФП противопоставляет себя ИП.

    хотя статья о ФП против ООП автор ошибочно решил, как и многие до него, что ФП это такая разновидность процедурного программирования когда вместо procedure люди пишут function. И ярко описал преимущества ООП над структурным программированием.

    (цит. В таком случае "весь поток выполнения программы" - будет представлять собой постоянное присваивание и рекурсивные вызовы там, где нужно обработать циклом.) так в принципе и работает строгое ФП автор очень удачно отразил его полную суть. только если в обычных языках программирования для такого поведения программы нужно написать жуткую бодягу, в функциональных языках получается достаточно компактный и удобный код.

    _______________________________________
    теперь о ФП и ООП, есть гипотеза что ООП как парадигма ортогонально к использованию ИП и ФП.
    Но если с Тьюринговским ИП ООП очень хорошо интегрируется, качественное ООП на асме говорят существует в природе. С ФП ООП с интегрировать наверно сложнее. В хаскеле можно вполне спокойно писать код классами, но на мой взгляд монструозные баяны которые получаются нарушают функциональную чистоту кода и мне лично непонятны. OCAML объектная реализация ФЯ CAML. Nemerle гибридный функционально императивный очень объектно ориентированный язык.

    но Erlang достаточно продвинутый язык не поддерживает ООП, в принципе даже анти-ООП язык. Тяжело смешать тёплое с мягким поэтому разработчики языка не страдали фигнёй. Хотя мой друг рассказывал о парадигме ООП в ObjectiveC, на мой взгляд она очень близка к внутренней структуре программ на ерланге и ООП такого типа можно спокойно прикрутить к Ерлангу или использовать паттерны такого типа сразу даже без допиливания напильником.

    ____________________________
    для веб разработчиков XSLT самый знакомый язык ФП.

    Сам я использую Erlang + XML + XSLT = HTML
    в связке два функциональных + два языка разметки, мне лично нравится хотя для практического применения это слишком хардкорно, к сожалению.

    С уважением Юрец.

    ОтветитьУдалить
  2. > в ФП переменных нет

    Как это нет? :) Во всех примерах по ФП, которые видел - переменные были. :)

    Вы работаете только с константами? ;)

    Использование переменных, как преимущество, выделяют даже при разработке веб-страниц, вот пост разработчиков JBoss о различии между технологией Facelets и технологией JSP.

    ОтветитьУдалить
  3. >Вы работаете только с константами? ;)
    некоторые рассматривают и так

    Достаточно сложно объяснить все тонкости, наиболее простой пример переменные в Ерланге они есть в любом нужном количестве, создаются на лету как в ПХП но с одним условием после первого присвоения (собственно сам процесс создания переменной) данные нельзя изменять. Так называемое правило единократного присваивания, оно позволяет использовать переменные но при этом не нарушать функциональную парадигму. Как рассматривать, как переменные, именованные данные, или константы (всё таки изменять значения потом нельзя, но если на это не обращать внимания то ближе к стандартным переменным).

    в ФП переменые трактуются так как переменные в математике
    К2=К+1, против К:=К+1;

    в Ерланге они используются для увеличения удобства программирования, на мой взгляд их основное значение в реализации функциональной абстракции (см. пред. пост), гораздо чаще в переменную закидываешь не число и т.д. а кусок кода (в буквальном смысле), некоторая замена копипасту;)

    fun sqrsinx(X)-> T=sin(X), T*T.

    вместо sin(X) в действительности может стоять любой корректный кусок кода, и это работает.

    Плюс нужно учитывать область видимости которая ограничена функцией, глобальных переменных нет по определению.

    ПС. в функциональных языках на основе комбинаторной логики переменных нет вообще исключение XSLT там одноразовые переменные есть но лично я использую их крайне редко так как принципиальной необходимости в них нет.

    ПС2. когда ваш стиль ФП по сути ближе к data driving applications переменные действительно не нужны, даже одноразовые.

    Юрец.

    ОтветитьУдалить
  4. ППС. основное отличие ФП в том что программу можно бектрейсить в принципе, если это возможно проделать до стартового состояния значит это ТРУ ФП.

    из за этого и отличия от императивного, отсутствие циклов и т.д.

    так же отличие ФП в том что программа исполненная задом наперёд 8) должна дать тот же результат что и в обычном порядке.

    Ерланг исполняет код в нормальном порядке, слева направо и сверху вниз, а вот Хаскель задомнаперед (в букв. смысле) потому на Ерланге програмать раз в 5 легче хотя суть у него строго функциональная.

    Зачем огород городить, Хаскель может чисто теоретически оптимимизировать исполнение! однопоточного! кода для увеличения производительности.
    Спецефичность ФП в Ерланге используется для маштабного паралельного программирования, в сотни и тысячи потоков на лету в средней прожке.

    ОтветитьУдалить
  5. Итого - переменные в ФП есть. Так же как и функции (они же - методы).

    Это было единственное, что Вы критиковали по моему объяснению. Остальное, в Ваших словах - относится к отличиям разных реализаций ФП.

    ОтветитьУдалить
  6. А по многопоточности - в ФП все вертится в стеке, т.е. нет разделяемых данных, т.е. не нужна синхронизация их.

    То же самое можно получить абсолютно в любом языке программирования, просто не используя разделяемые данные.

    Такой же миф, как и остальное. ;)

    ОтветитьУдалить