Мне к сожалению не доводилось писать на функциональных языках, но слышал о них много хорошего. Много говорится о гибкости и т.п., но много и о торможении прог на них написанных. И вот у меня возник вопрос – стоит ли применять функциональные языки, и если да, то когда, и какие?
10 января 2009 в 12:03
Михаил, ты, похоже, что-то путаешь – си не функциональный язык, а процедурный.
//en.wikipedia.org/wiki/Functional_programming
10 января 2009 в 12:02
Жека jkff Кирпичев, читай вопрос темы, теперь читай мой ответ. Я в ваших холиварах не участвую, я лишь привел пример когда программист вынужден применять лекговесный рантайм функциональныого языка вместо тяжеловесных рантаймов. Из пушки по воробьям не стреляют.
10 января 2009 в 11:05
Михаил, никто не спорит, что есть задачи, где без си или даже ассемблера не обойтись. Но причем тут функциональщина?
10 января 2009 в 11:01
А не забыли про устройства, в которых всего мало, и памяти и процессора? Там не то, что на операционную систему, там тупо наплюсовый рантайм может не хватить места. Вот тогда спасет функциональный язык по имени Си.
8 января 2009 в 20:04
спасибо большое, это интересно.
8 января 2009 в 14:02
2 Жека
Спасибо! Пойду читать.
8 января 2009 в 14:00
Жека, спасибо огромное!
* ушел штудировать
8 января 2009 в 12:05
Про теорию категорий:
Теория групп позволяет одинаковым образом рассматривать, скажем, группу перестановок и группу движений в пространстве, и т.п. – то есть, позволяет рассуждать о свойствах групп как таковых, распространять теоремы об одной группе – на другую группу, пользуясь какими-то связями между ними типа гомоморфизмов или изоморфизмов.
Теория категорий позволяет одинаковым образом рассматривать сами алгебраические структуры.
По сути, категория – это граф, в котором допускаются петли и многократные ребра между двумя вершинами (в т.ч. кратные петли), определена операция "композиции" (для каждого пути длины 2 A –f–> B –g–> C должен быть указан некоторый "эквивалентный" ему путь A –(g.f)–> C) и в каждом объекте существует "единичная" петля. Композиция должна быть ассоциативной (чтобы можно было сокращать пути любой длины), а единичная петля должна быть единицей относительно композиции.
Например, группа – это категория с одним объектом, в которой все морфизмы являются изоморфизмами (и каждый морфизм соответствует некоторому элементу группы); а любое частично упорядоченное множество – это категория, в которой между каждыми двумя объектами есть не более одного морфизма (и этот морфизм соответствует факту "A <= B"; композиция соответствует групповому произведению). Ну, а самая привычная категория – это категория множеств и функций между ними: объекты – это все множества, а морфизмы между объектами A,B – это функции A->B. Композиция – это композиция функций, а единичный морфизм – тождественная функция.
Можно подниматься на более высокие уровни абстракции и рассматривать, скажем, категорию групп и групповых гомоморфизмов, или категорию частично упорядоченных множеств и монотонных функций между ними. Тут объекты – это алгебраические структуры некоторого типа, а морфизмы – операции, сохраняющие структуру.
Можно подняться еще выше: категория всех категорий и "функторов" между ними (функтор – это гомоморфизм категорий, сохраняющий композицию и единицу). На этом уровне начинаются интересные вещи. А можно еще выше: категория функторов между двумя категориями и т.н. "естесственных трансформаций" между ними (самая близкая им аналогия – полиморфные функции). Вот с такой экипировкой начинаются совсем интересные вещи
Вообще говоря, "философия" теории категорий – в том, что первичны не объекты, а морфизмы, т.е. "связи" между ними, и почти все понятия определяются именно в их терминах, т.е. сущность определяется через ее взаимодействие с другими сущностями.
Как видно, категория – понятие весьма абстрактное, но, как оказывается, очень мощное.
Это позволяет теории категорий обобщать привычные и, казалось бы, не имеющие ничего общего понятия до невиданных уровней абстракции и формулировать теоремы, которые оказываются верны в самых неожиданных ситуациях.
Например, в теории категорий произведение объектов определяется таким образом, что под него попадают и декартово произведение (в категории множеств), и операция минимума на частично упорядоченном множестве, и геометрическое произведение двух проекций на разные координатные оси, и всякое другое.
А под понятие "экспоненциального объекта" попадают и функции из одного множества в другое (A -> B), и импликация (в категории логических высказываний и верных следствий между ними) (A -> B). Следствием этого, кстати, является знаменитый изоморфизм Карри-Ховарда.
8 января 2009 в 12:05
К программированию все это хозяйство имеет следующее отношение:
– Полиморфные функции по своим свойствам очень похожи на естесственные трансформации. Из этого следуют знаменитые "Бесплатные теоремы" – обязательно прочитайте, если не читали: //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 и спрашивать – там такого наотвечают, что первое время практически каждый раз будет большой скачок знаний.
8 января 2009 в 11:01
Третий подписавшийся.
8 января 2009 в 10:02
2 Алексей ITkid Гридин
Подписываюсь, самому интересно.
7 января 2009 в 11:00
Жека jkff Кирпичев, а можно про теорию категорий чуть поподробней? В частности какие смежные разделы математики затрагивает. И с какой стороны подойти к изучению?
И что ещё может быть полезно при освоении функционального программирования, если браться серьёзно?
6 января 2009 в 22:04
Спасибо!
6 января 2009 в 22:00
Для SICP используй PLT Scheme.
Насчет производительности функциональных языков – это враки. OCaml безумно быстрый, наравне с си. Сами идеи Хаскелла (чистота, система типов итп) позволяют *такие* оптимизации со стороны компилятора (одни безграничные возможности инлайнинга чего стоят), что в умелых руках он тоже часто может обогнать си. Если же не заморачиваться, то получается, ну, может, в 2-3 раза медленнее, чем на си, но на порядки быстрее, чем на том же Ruby, скажем.
Все, что говорят о непрактичности функциональщины – враки. Она и быстрая, и удобная, и нет там ничего типа "выучить теорию категорий, чтобы напечатать hello world", и библиотеки есть для почти всего, а для чего нету – так напиши, это легко с таким мощным языком в руках. Просто непривычно, думать много приходится, хоть в итоге и получается в несколько раз меньше кода за в несколько раз меньшее время, вообще без багов и несравнимо более читаемо и расширяемо.
В общем, скажу так:
Выучить надо обязательно.
Выучить так, чтобы мог применять на практике – придется хорошенько попопеть (фактически ведь учишься программировать заново, с нуля; когда си учил, тоже небось пришлось попотеть), но будешь творить чудеса. Останется только одна проблема – биение лбом в стенку непонимания коллег и руководства
6 января 2009 в 22:00
…А лучше – забудь все, что я сказал, главное – постарайся отнестись к SICP серьезно и прочитать ее от корки до корки, делая хотя бы некоторые упражнения. И/или видеолекции посмотри – //groups.csail.mit.edu/mac/classes/6.001/abelso...
6 января 2009 в 21:00
#5,
clisp – Common Lisp
6 января 2009 в 20:05
Жека jkff Кирпичев за SICP спасибо. А какой компилятор лиспа лучше использовать? (Из бесплатных конечно)
6 января 2009 в 20:05
Ну так… обычно для работы со сложными структурами данных, разборе текстов…в задачах эвристического поиска, и всякого того в чем много сложной логики.
Хотя лично я не спец.
А вообще если под функциональным программированием понимать всякое программирование в котором функция является обектом первого рода, то функциональное программирование можно применять везде например для написния ГУИ )
6 января 2009 в 20:02
По-моему, лучше ставить вопрос наоборот: когда НЕ стоит применять функциональные языки.
6 января 2009 в 20:02
логичнее всего применять их для функционального программирования.
А вообще почитай про это хотя бы в вики.
6 января 2009 в 20:02
Применять-не применять, а выучить надо в любом случае – ты не представляешь себе, до какой степени изучение функционального стиля положительно влияет на умение писать на других языках. SICP прочитай, дальше сам поймешь.