singlepost

Когда имеет смысл использовать функциональный язык? << На главную или назад  

Мне к сожалению не доводилось писать на функциональных языках, но слышал о них много хорошего. Много говорится о гибкости и т.п., но много и о торможении прог на них написанных. И вот у меня возник вопрос – стоит ли применять функциональные языки, и если да, то когда, и какие?

26 ответов в теме “Когда имеет смысл использовать функциональный язык?”

  1. 21
    Жека Кирпичев ответил:

    Михаил, ты, похоже, что-то путаешь – си не функциональный язык, а процедурный.

    //en.wikipedia.org/wiki/Functional_programming

  2. 20
    Михаил Михалев ответил:

    Жека jkff Кирпичев, читай вопрос темы, теперь читай мой ответ. Я в ваших холиварах не участвую, я лишь привел пример когда программист вынужден применять лекговесный рантайм функциональныого языка вместо тяжеловесных рантаймов. Из пушки по воробьям не стреляют.

  3. 19
    Жека Кирпичев ответил:

    Михаил, никто не спорит, что есть задачи, где без си или даже ассемблера не обойтись. Но причем тут функциональщина?

  4. 18
    Михаил Михалев ответил:

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

  5. 17
    Леонид Максимов ответил:

    спасибо большое, это интересно.

  6. 16
    Артём Шалхаков ответил:

    2 Жека

    Спасибо! Пойду читать.

  7. 15
    Дмитрий Шалхаков ответил:

    Жека, спасибо огромное!
    * ушел штудировать

  8. 14
    Жека Кирпичев ответил:

    Про теорию категорий:

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

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

    По сути, категория – это граф, в котором допускаются петли и многократные ребра между двумя вершинами (в т.ч. кратные петли), определена операция "композиции" (для каждого пути длины 2 A –f–> B –g–> C должен быть указан некоторый "эквивалентный" ему путь A –(g.f)–> C) и в каждом объекте существует "единичная" петля. Композиция должна быть ассоциативной (чтобы можно было сокращать пути любой длины), а единичная петля должна быть единицей относительно композиции.

    Например, группа – это категория с одним объектом, в которой все морфизмы являются изоморфизмами (и каждый морфизм соответствует некоторому элементу группы); а любое частично упорядоченное множество – это категория, в которой между каждыми двумя объектами есть не более одного морфизма (и этот морфизм соответствует факту "A <= B"; композиция соответствует групповому произведению). Ну, а самая привычная категория – это категория множеств и функций между ними: объекты – это все множества, а морфизмы между объектами A,B – это функции A->B. Композиция – это композиция функций, а единичный морфизм – тождественная функция.

    Можно подниматься на более высокие уровни абстракции и рассматривать, скажем, категорию групп и групповых гомоморфизмов, или категорию частично упорядоченных множеств и монотонных функций между ними. Тут объекты – это алгебраические структуры некоторого типа, а морфизмы – операции, сохраняющие структуру.

    Можно подняться еще выше: категория всех категорий и "функторов" между ними (функтор – это гомоморфизм категорий, сохраняющий композицию и единицу). На этом уровне начинаются интересные вещи. А можно еще выше: категория функторов между двумя категориями и т.н. "естесственных трансформаций" между ними (самая близкая им аналогия – полиморфные функции). Вот с такой экипировкой начинаются совсем интересные вещи :)

    Вообще говоря, "философия" теории категорий – в том, что первичны не объекты, а морфизмы, т.е. "связи" между ними, и почти все понятия определяются именно в их терминах, т.е. сущность определяется через ее взаимодействие с другими сущностями.

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

    Например, в теории категорий произведение объектов определяется таким образом, что под него попадают и декартово произведение (в категории множеств), и операция минимума на частично упорядоченном множестве, и геометрическое произведение двух проекций на разные координатные оси, и всякое другое.
    А под понятие "экспоненциального объекта" попадают и функции из одного множества в другое (A -> B), и импликация (в категории логических высказываний и верных следствий между ними) (A -> B). Следствием этого, кстати, является знаменитый изоморфизм Карри-Ховарда.

  9. 13
    Жека Кирпичев ответил:

    К программированию все это хозяйство имеет следующее отношение:
    – Полиморфные функции по своим свойствам очень похожи на естесственные трансформации. Из этого следуют знаменитые "Бесплатные теоремы" – обязательно прочитайте, если не читали: //citeseer.ist.psu.edu/wadler89theorems.html . Это потрясающе крутая штука; и мне кажется, их возможности еще далеко не до конца исследованы.
    – В Хаскелле используется понятие "монад", вышедшее из теории категорий. В теоркатной формулировке оно звучит устрашающе и совершенно непонятно (функтор F, плюс две ест.тр-ии h:Id=>F, i:F*F=>F), но оказывается, что оно имеет огромное практическое значение и является прекрасным описанием для множества вещей, таких как вычисления с состоянием, вычисления с несколькими результатами, вычисления с продолжениями, статистические распределения, парсеры, и т.п. Можно почитать тут: //spbhug.folding-maps.org/wiki/MonadsEn
    – Оказывается, что многие другие понятия из программирования тоже соответствуют теоркатным понятиям: например, унификация двух термов с метапеременными (Prolog) – это вычисление "коуравнителя" (coequalizer); функции с пре- и пост-условиями – это pullbacks/pushouts (не знаю русского термина), и т.п.
    – Есть довольно много работ по применению теории категорий к разным областям программирования: я лично видел – к формализации параллельных процессов, к теории СУБД (у меня самого будущий диплом – оптимизация SQL с помощью теорката, а именно – бесплатных теорем), к формализации теории систем (модульность итп)…

    Насчет подойти к ее изучению – самое лучшее из известного мне – книга Barr, Wells – Basic Category Theory for Computing Science. У нее есть сокращенная (но и усложненная) версия: //www.let.uu.nl/esslli/Courses/barr/barrwells.ps . Вообще, разных туториалов по теоркату в инете довольно много; достаточно зайти на delicious.com и поискать там (результаты буду качественнее, чем в гугле).

    При освоении функционального программирования, если браться серьезно, будет полезным – подписаться на рассылку haskell cafe, частенько заходить на #haskell , зайти на haskell.org и почитать упоминающиеся там туториалы и саму wiki, зайти на //en.wikibooks.org/wiki/Haskell и почитать там *все*, порешать задачи с projecteuler.net, затем (когда основы будут ясны) почитать Real World Haskell (book.realworldhaskell.org). И, блин, кодить, кодить, кодить и кодить! Как только что-то непонятно – залезать на #haskell и спрашивать – там такого наотвечают, что первое время практически каждый раз будет большой скачок знаний.

  10. 12
    Артём Шалхаков ответил:

    Третий подписавшийся.

  11. 11
    Дмитрий Шалхаков ответил:

    2 Алексей ITkid Гридин
    Подписываюсь, самому интересно.

  12. 10
    Алексей Гридин ответил:

    Жека jkff Кирпичев, а можно про теорию категорий чуть поподробней? В частности какие смежные разделы математики затрагивает. И с какой стороны подойти к изучению?
    И что ещё может быть полезно при освоении функционального программирования, если браться серьёзно?

  13. 9
    Сергей Савин ответил:

    Спасибо!

  14. 8
    Жека Кирпичев ответил:

    Для SICP используй PLT Scheme.

    Насчет производительности функциональных языков – это враки. OCaml безумно быстрый, наравне с си. Сами идеи Хаскелла (чистота, система типов итп) позволяют *такие* оптимизации со стороны компилятора (одни безграничные возможности инлайнинга чего стоят), что в умелых руках он тоже часто может обогнать си. Если же не заморачиваться, то получается, ну, может, в 2-3 раза медленнее, чем на си, но на порядки быстрее, чем на том же Ruby, скажем.

    Все, что говорят о непрактичности функциональщины – враки. Она и быстрая, и удобная, и нет там ничего типа "выучить теорию категорий, чтобы напечатать hello world", и библиотеки есть для почти всего, а для чего нету – так напиши, это легко с таким мощным языком в руках. Просто непривычно, думать много приходится, хоть в итоге и получается в несколько раз меньше кода за в несколько раз меньшее время, вообще без багов и несравнимо более читаемо и расширяемо.

    В общем, скажу так:
    Выучить надо обязательно.
    Выучить так, чтобы мог применять на практике – придется хорошенько попопеть (фактически ведь учишься программировать заново, с нуля; когда си учил, тоже небось пришлось попотеть), но будешь творить чудеса. Останется только одна проблема – биение лбом в стенку непонимания коллег и руководства :)

  15. 7
    Жека Кирпичев ответил:

    …А лучше – забудь все, что я сказал, главное – постарайся отнестись к SICP серьезно и прочитать ее от корки до корки, делая хотя бы некоторые упражнения. И/или видеолекции посмотри – //groups.csail.mit.edu/mac/classes/6.001/abelso...

  16. 6
    Андрей Горбоконь ответил:

    #5,
    clisp – Common Lisp

  17. 5
    Сергей Савин ответил:

    Жека jkff Кирпичев за SICP спасибо. А какой компилятор лиспа лучше использовать? (Из бесплатных конечно)

  18. 4
    Николай Митропольский ответил:

    Ну так… обычно для работы со сложными структурами данных, разборе текстов…в задачах эвристического поиска, и всякого того в чем много сложной логики.

    Хотя лично я не спец.

    А вообще если под функциональным программированием понимать всякое программирование в котором функция является обектом первого рода, то функциональное программирование можно применять везде например для написния ГУИ )

  19. 3
    Артём Шалхаков ответил:

    По-моему, лучше ставить вопрос наоборот: когда НЕ стоит применять функциональные языки.

  20. 2
    Марина Гаврилина ответил:

    логичнее всего применять их для функционального программирования.

    А вообще почитай про это хотя бы в вики.

  21. 1
    Жека Кирпичев ответил:

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

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.