|
|
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Народ, уже долгое время пытаюсь понять в чем суть и фишка направления под названием "функциональное программирование". Читаю форумы, качаю книги, но понять что это дает и на каких задачах можно получить выигрыш не понятно. Что видно со стороны: Все доки начинают объяснять про лямбда-исчисление, потом как правило излагается куча жуткой и непонятной математики. Проблема в том, что не объясняется, какой смысл определять функции вместо f(x,y) экзотичной записью /\ x.y. Пока для меня все это выглядит как не стандартный способ записи выражений, не более того. Экзотичная запись порождает экзотичные и нетривиальные записи простых выражений, часто упоминается некие правила интерпретации таких выражений и загадочное слова - карринг. Выглядит очень умно, но ни фига это все не понятно. Фишка номер 2, нет циклов, вообще нет циклов. Все надо определять через рекурсивные функции. Меня еще в школе (начало 90-х) учили на уроках информатики, что рекурсия это плохо, ибо не понятно заранее насколько может быть глубина вызовов. В чем круть абстракции записывать все через рекурсию никто не объсняет. Я могу понять, что если поменять взгляд на жизнь и перейти к новым абстракциям ее описывающим, то можно получить выигрыш в некоторых случаях. К сожалению, я не нашел пока ни одной книги, где-бы анализировался и описывалось преимущество решения задач в ФП-стиле перед императивным способом. И самое главное, не вижу связи между ФП и декларативностью. SQL вот декларативен и обладая этим свойством имеет колоссальное преимущество в своей области перед более слабыми абстракциями типа прцедурным программированием и ООП парадигмой. В общем просьба объяснить простым языком, в чем соль, ради чего это все надо и где зарыт профит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 16:21:10 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Фишка номер 1 т.н. "чистых" функциональных языков (в которых в функциях не допускается побочных эффектов) в том, что программу В ЛЮБОЕ ВРЕМЯ ВЫПОЛНЕНИЯ ГАРАНТИРОВАННО БЕЗОПАСНО моно распараллелить. Т.е. у тебя был один поток выполнения -- мы делаем два потока, три и т.п. Это даёт ф.я. просто билет в будущее, потому как одно из основных направлений IT сейчас -- развитие параллельных вычислений. Но не все ФЯ чистые. Фишка номер 2 любых ф.я. (и не чистых тоже) -- это функции или алгоритмы высших порядков. Это -- возможности писать алгоритмы, абстрагируясь от конкретных структур данных и частностей. Но эта возможность используется вовсю уже давно в других языках (не функциональных), например, C или С++. Ни номер 1, ни номер 2 принципиально ничего в общем для ф.я. не даёт (н.1 даёт, но не для всех ф.я.). Есть ещё другой аспект, третий, как правило, ф.я. -- мощные, удобные и простые языки программирования, сложность только в постижении главных концепций. На них просто и удобно программировать. > И самое главное, не вижу связи между ФП и декларативностью. SQL вот > декларативен и обладая этим свойством имеет колоссальное преимущество в Не все функциональные языки декларативные. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 16:35:37 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Ggg_old wrote: К сожалению, я не нашел пока ни одной книги, где-бы > анализировался и описывалось преимущество решения задач в ФП-стиле перед > императивным способом. ФП -- это не обязательно декларативное программирование. А книги наверное надо искать среди книг по чистым ф.я. > И самое главное, не вижу связи между ФП и декларативностью. SQL вот Её и нет. ФЯ не обязан быть декларативным. > декларативен и обладая этим свойством имеет колоссальное преимущество в > своей области перед более слабыми абстракциями типа прцедурным > программированием и ООП парадигмой. Ну, чистые ф.я. имеют такие же преимущества (и недостатки) в некоторых областях. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 16:38:08 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Ggg_oldвместо f(x,y) экзотичной записью /\ x.y. Фактически, ты сам ответил на свой вопрос. В первом определении есть имя функции, а во втором нет. Чегтовски неудобно обращаться с функциями как с переменными, если они должны быть поименованы :( А в этом и заключается цель ФП :) Ggg_old Меня еще в школе (начало 90-х) учили на уроках информатики, что рекурсия это плохо, ибо не Стоит забыть то чему учили в школе и подумать почему рекурсия плохо ??? Очевидно потому-что неконтролируемо жрет стек ? Но во первых в реализациях ФП языков стек устроен по другому (не аппаратный, а на куче), а во вторых хвостовая рекурсия может быть (а в некоторых языках должна быть) реализована как цикл. Видимо не всякая рекурсия это плохо ? IMHO: вместо того чтобы акцентировать внимание на том, что ФП непривычно, следовало задать вопрос, ради чего весь сыр бор ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 17:02:37 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Ggg_oldВ общем просьба объяснить простым языком, в чем соль, ради чего это все надо и где зарыт профит. Я частично с тобой согласен. Я тоже ищу полезное применение для для языков lisp, haskell у себя на работе, но к сожалению не нахожу. Есть идеи применить haskell для анализа кучи трассировочных файлов Oracle, но здесь рациональная мысль борется с нерациональной. Ведь тот-же анализ я могу запрограммировать на java+antlr. И бог его знает, какое решение будет дешевле для меня реализовано. На haskell я пока это не могу сделать. Не хватает знаний и опыта! Подытоживая, скажу, что в ФП вроде-бы есть ВСЁ что надо джентльмену. Но только нет экономического обоснования применения ФП. Я когда-то поднимал ветку в Работе по этому вопросу и еще раз убедился в своей правоте. Рынка ФП-программистов у нас де-факто не существует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 17:14:22 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
mayton Подытоживая, скажу, что в ФП вроде-бы есть ВСЁ что надо джентльмену. Но только нет экономического обоснования применения ФП. Видимо по той причине, что джентельмены таких вопросов не задают ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 17:16:00 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)Видимо по той причине, что джентельмены таких вопросов не задают ? Браво! После этого новичкам остаётся поверить в сущестование всемирного заговора ФП и поставить функциональщиков на уровень массонов и прочих ЕРЖ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 17:30:09 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
maytonGluk (Kazan)Видимо по той причине, что джентельмены таких вопросов не задают ? Браво! После этого новичкам остаётся поверить в сущестование всемирного заговора ФП и поставить функциональщиков на уровень массонов и прочих ЕРЖ. и кому от этого станет хуже ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 17:32:17 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Лично мне - ни холодно ни жарко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 17:34:56 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Впрочем это оффтоп. Давай будем в теме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 17:35:38 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Хмм, я бы не задавал этот вопрос если бы не одно но. Я использую один принцип, если не можешь понять что-то досконально, то наблюдай за людьми, которые в этом понимают и добиваются результата. Читать, что они пишут и думают. Так вот, интерес к ФП у меня начал появляться по результатам обзорам блогов по конкурсам IFCPC. Конкурсы эти не тривиальны, рассчитаны для очень нетривиальных программистов в правильно поставленными мозгами. Дальнейшее изучение их статей, мыслей привело меня к выводу: эти ребята умнее на два порядка чем я, видят вперед индустрию на порядок дальше чем я. Так вот, практически все результатов на самых сложных и нетривиальных задачах добиваются именно применяя языки ФП. И есть в их среде мнение, что все задачи можно решить на huskell плюс некоторые куски на C. На крайняк - OCAML. Т.е. что-бы быть на острие прогресса надо владеть ФП+С. Изучение причудливого синтаксиса ФП языка, в моем случае это был OCAML, не открыл для меня новые горизонты, т.к. я увидел отсутствие циклов, замысловатый способ записи функций и.т.д. Т.е. главное, что я не понял, это идеологию применения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 19:17:01 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Насчет абстракций, приведу пример. Переход в абстракции, это хорошо. Например, помню как нам рассказывали про Z-проеобразование. Если у вас возник затык, то есть такое прием: перейти в абстрактную алгебраическую форму, в ней решить равнение как линейное. И перейти из нее обратно (правда это не всегда возможно, если не сказать, что почти некогда ;). Вот это я понимаю польза абстракции - выпрыгнуть за границы реальности и тем самым найти решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 19:22:18 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Думал, куда написать этот пост, либо в чуждый мне ru_declarative или в родной sql.ru Решил запоститься в родные пенаты, тут не страшно задать дурные вопросы. В ru_declarative уже познали ДАО и размышляют исключительно над коанами. Коаны для мене - overkill. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 19:27:38 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Фишка номер 1 т.н. "чистых" функциональных языков (в которых в функциях не допускается побочных эффектов) в том, что программу В ЛЮБОЕ ВРЕМЯ ВЫПОЛНЕНИЯ ГАРАНТИРОВАННО БЕЗОПАСНО моно распараллелить. Т.е. у тебя был один поток выполнения -- мы делаем два потока, три и т.п. Это даёт ф.я. просто билет в будущее, потому как одно из основных направлений IT сейчас -- развитие параллельных вычислений. Аж дух захватывает... Вот мне интересно, а зачем мне иметь возможность "В ЛЮБОЕ ВРЕМЯ ВЫПОЛНЕНИЯ ГАРАНТИРОВАННО БЕЗОПАСНО распараллелить" какую - либо функцию, которая реализует глубоко сермяжно последовательный алгоритм? Если единственное преимущество ф.я. с точки зрения распаралеливания вычислений состоит в том что они заставляют кодить потокобезопасные проги, то это несомненно круто, но вот заявлять что на этом основании это им даёт какой-то там билет в будущее - имхо перебор. Главные проблемы в этом направлении - минимизация последовательной части алгоритмов (бо закону Амдала глубоко перпендикулярно на каком языке написан код) и количество промахов по кэшу. Так что если затрагивать этот аспект, рассказали б лучше чем паралельные эипиай для ф.я. лучше птреадов, опенМП и МПАИ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 19:41:42 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Ggg_old, Вот, имхо думаю, что "чистое" ФП интересно больше тем, что егойные идеи постепенно перетекают в мейнстрим. Появляются "постфункциональные" ( (c) Одерский ) языки типа Scala и Nemerle, где можно писать вполне себе императивные программы. А можно применить принципы ФП и забыть про проблемы синхронизации потоков, mutable state, NullPointerException... А заодно выкинуть из головы половину паттернов ООП, ибо более оные не требуются :) /* субъективные впечатления после года писания на Scala */ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 19:52:14 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Диез, вы уже говорите коанами ;) SCALA - это lisp-подобный язык или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 20:05:12 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Ggg_oldДиез, вы уже говорите коанами ;) SCALA - это lisp-подобный язык или я ошибаюсь? Нее, скорее java++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 20:18:34 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Ggg_oldИ есть в их среде мнение, что все задачи можно решить на huskell плюс некоторые куски на C. На крайняк - OCAML. Если я не ошибаюсь, все задачи можно решить на языке который обладает некой полнотой по Тьюрингу. И поэтому к их мнению следует отнестись с некой долей скепсиса. По крайней мере пока не пояснят почему. В любом случае, это предмет спора. Т.е. что-бы быть на острие прогресса надо владеть ФП+С. Здесь - согласен. Изучение ФП языка подобно изучению латыни или эсперанто перед погружением в иностранные языки. В любом случае оно - полезно. увидел отсутствие циклов, замысловатый способ записи функций и.т.д. Т.е. главное, что я не понял, это идеологию применения. Будь осторожен! Отсутствие циклов еще не повод для ломания стеретипов или ухода в иную веру. Кстати циклы в Haskel и Lisp присутствуют и не возбороняются к приминению. Короче, подходя к программной реализации вооружайся скепсисом и думай как Одессит - "И шо я с этого буду иметь?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 21:36:36 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
MasterZivФишка номер 1 т.н. "чистых" функциональных языков (в которых в функциях не допускается побочных эффектов) в том, что программу В ЛЮБОЕ ВРЕМЯ ВЫПОЛНЕНИЯ ГАРАНТИРОВАННО БЕЗОПАСНО моно распараллелить. Т.е. у тебя был один поток выполнения -- мы делаем два потока, три и т.п. Это даёт ф.я. просто билет в будущее, потому как одно из основных направлений IT сейчас -- развитие параллельных вычислений. Мастер я рискну предположить, что на практике не так всё просто и распараллеливание всего и вся еще не гарантирует быстрого получения результата. Мне например не понятно, КТО и КАК будет диспетчеризировать функции-процессы? На основании каких правил? Нужно учитывать накладные расходы на ту-же мультизадачность. "Столпы" программирования, такие как Дональд Кнут говорят-де "для большего процента ПО параллелизм не даёт ощутимых преимуществ" (очевидно имеют в виду свои фундаментальные алгоритмические блоки). Маэстро Вирт даёт очень нелестную оценку самой парадигме, заявляя что GC - это вовсе не круто и отстой а чистота, при параллелизме имеет очень небольшое преимущество и shared ресурсы всегда легко идентифицировать в программе на императивном языке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 21:49:36 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
2mayton: Прямо в точку! Выражение "В чем соль, ради чего это все надо и где зарыт профит." эквивалентно "И шо я с этого буду иметь?". Просто приходится делать скидку на то, что не всем повезло как мене жить в Одессе и излагать свои мысли столь пространным официальным русским языком ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 21:53:15 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
mayton Мастер я рискну предположить, что на практике не так всё просто и распараллеливание всего и вся еще не гарантирует быстрого получения результата. Мне например не понятно, КТО и КАК будет диспетчеризировать функции-процессы? На основании каких правил? Нужно учитывать накладные расходы на ту-же мультизадачность. Насколько я знаю, диспатчеризацией занимается ОС, а вот декларация параллельности лежит на программисте. Вот например в GPH оно делается вот так: Код: plaintext 1. 2. 3. 4. 5. 6. Где "x 'par' y" означает вычислить y при этом x вычислить параллельно А вот так в F# Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Лично я параллельным программированием не занимаюсь, а просто использую F# в качестве скриптового языка время от времени - мне нравится легкость синтаксиса и возможность комбинировать функции а также поддержка со стороны Visual Studio. Еще фот как-то сделал и подключил к аксапте бьютифаер для SQL на parsec - это такая библиотека для написания парсеров на Haskell. Фишка в том, что грамматика описывается на том же языке, что и семантика и, соотвественно, можно использовать все богатство средств обобщения кода - выносить повторяющиеся правила в функции с параметрами и т.д. Маэстро Вирт даёт очень нелестную оценку самой парадигме, заявляя что GC - это вовсе не круто и отстой а чистота, при параллелизме имеет очень небольшое преимущество и shared ресурсы всегда легко идентифицировать в программе на императивном языке. Одно дело идентифицировать, другое - проверить формально и чтобы компилятор ругнулся. А еще с функциональным кодом легче проводить всякие манипуляции - доказывать его свойства или, например, транслировать в SQL. Не даром LINQ сделал Эрик Майер, один из авторов Haskell. LINQ по сути, это воплощение концепции хаскелевской монады, сейчас еще из функциональных языков тащат функциональное реактивное программирование (Rx Framework). В-общем, с моей точки зрения, стоит поковырять какой-нибудь чисто функциональный язык просто чтобы понять концепции. С использованием сложнее (если есть окружение со своими стандартами), но во-первых, всегда есть какие-то задачи, которые можно решать для себя. Во-вторых, есть гибридные языки (scala, F#, nemerle), которые позволяют плавно интегрироваться распространенные среды (вот сегодня хороший пример нашел в блоге) В-третьих, можно функционально писать на обычных языках, например на javascript это довольно легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 23:16:37 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
mayton Мастер я рискну предположить, что на практике не так всё просто и распараллеливание всего и вся еще не гарантирует быстрого получения результата. Мне например не понятно, КТО и КАК будет диспетчеризировать функции-процессы? На основании каких правил? Нужно учитывать накладные расходы на ту-же мультизадачность. Насколько я знаю, диспатчеризацией занимается ОС, а вот декларация параллельности лежит на программисте. Вот например в GPH оно делается вот так: Код: plaintext 1. 2. 3. 4. 5. 6. Где "x 'par' y" означает вычислить y при этом x вычислить параллельно А вот так в F# Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Лично я параллельным программированием не занимаюсь, а просто использую F# в качестве скриптового языка время от времени - мне нравится легкость синтаксиса и возможность комбинировать функции а также поддержка со стороны Visual Studio. Еще фот как-то сделал и подключил к аксапте бьютифаер для SQL на parsec - это такая библиотека для написания парсеров на Haskell. Фишка в том, что грамматика описывается на том же языке, что и семантика и, соотвественно, можно использовать все богатство средств обобщения кода - выносить повторяющиеся правила в функции с параметрами и т.д. Маэстро Вирт даёт очень нелестную оценку самой парадигме, заявляя что GC - это вовсе не круто и отстой а чистота, при параллелизме имеет очень небольшое преимущество и shared ресурсы всегда легко идентифицировать в программе на императивном языке. Одно дело идентифицировать, другое - проверить формально и чтобы компилятор ругнулся. А еще с функциональным кодом легче проводить всякие манипуляции - доказывать его свойства или, например, транслировать в SQL. Не даром LINQ сделал Эрик Майер, один из авторов Haskell. LINQ по сути, это воплощение концепции хаскелевской монады, сейчас еще из функциональных языков тащат функциональное реактивное программирование (Rx Framework). В-общем, с моей точки зрения, стоит поковырять какой-нибудь чисто функциональный язык просто чтобы понять концепции. С использованием сложнее (если есть окружение со своими стандартами), но во-первых, всегда есть какие-то задачи, которые можно решать для себя. Во-вторых, есть гибридные языки (scala, F#, nemerle), которые позволяют плавно интегрироваться распространенные среды (вот сегодня хороший пример нашел в блоге) В-третьих, можно функционально писать на обычных языках, например на javascript это довольно легко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 23:16:41 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
извините за дубль ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 23:17:15 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
С одной стороны ответ по-существу и спасибо за это, с другой стороны - то что вы продемонстрировали семантически очень похоже на директивы OpenMP для императивных C/C++ и Fortran: #pragma omp parallel #pragma omp for и т.д. Так что в этом смысле говорить о билете в будущее параллельных вычислений именно для ф.я. всеж таки рановато... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2010, 23:43:37 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
В приведенном коде на F# не видно ничего функционального. Обычный императивный код, только записанный необычным синтаксисом другого языка: "Для каждого элемента списка вызвать функцию такую-то, которая выполняет строгую последовательно операция". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2010, 00:22:01 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36430298&tid=1343707]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
174ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 436ms |

| 0 / 0 |
