Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 452 19-07-2006 11:51 | |
Ответ на »сообщение 449« (Артем)
___________________________
Просто, у меня другие задачи.
И на основании этого вы сделали вывод что Пролог доминирует в логическом программировании ? :))
Недостаток Forward chaining, по-моему, кроется в том, что пользователь может ввести некорректные правила.
Интересно. А в пролог нельзя ввести некорректные правила ? Или это тоже из серии "все дело в моем опыте" ? :))
На самом деле как пролог так и опс предназначены прежде всего для программистов, а не для простых пользователей.
И в том и в другом случае правила будет создавать программист.
Только вот насчет количественного соотношения Forward и Backward chaining, думаю вы ошибаетесь.
Откуда такая инфа уважаемый, если вы только что узнали о существовании forward chaning ? :))
Уверяю вас подавляющее большинство установленных индустриальных экспертных систем сделано при помощи forward chaning (RETE algoritm)
Пролог (backward chaining) хорошо подходит для задач типа
"Свет мой зеркальце, скажи
Да всю правду доложи.
Кто на свете всех милее,
Всех прекрасней и белее?"
А ops (forward chainig) идеально подходит для задач типа
"Как появится корабль на горизонте - свистать всех наверх!!"
Или "А ну перестрой мне эти три ханойские башенки."
То есть пролог отвечает на вопросы. При помощи него хорошо анализировать больщой обьем данных и находить скрытую информацию.
А ops хорошо подходит для принятия решений на основе большого обьема несвязанной информации. И РЕАГИРОВАНИЯ на изменения этой информации.
Подумайте сами какие задачи в большинстве случаев приходится решать в бизнесе, особенно в финансовом или в IT
Насчет ленивых вычислений. В Лиспе они по умолчанию ленивые, или их надо специально обозначать таковыми (как в OCAML)?
В лиспе вообще НЕТ ленивых вычислений. Как и нет ООП, нет аспектов, нет list comprehensionы. Да черт возьми практически НИЧЕГО НЕТ. И в то же время в лиспе есть все то что только может быть в любом языке программирования. Есть ООП (библиотека CLOS), есть list comprehensions (если читали эту ветку то код макроса я приводил), есть аспекты, и конечно же есть ленивые вычисления (библиотека)
Дело в том что называть все это библиотеками немножко неправильно.
Это не библиотеки в вашем понимании этого слова.
Они не добавляют новые функции в язык. Они добавляют НОВЫЕ КОНСТРУКЦИИ, и вообще могут поменять даже как работает сам язык.
Вот скажем библиотека работы с sql в дельфи, не изменяет сам язык, не добавляет в него sql.
Вы там sql все равно в виде string пишете. Причем неважно что вы там написали, дельфи просто схавает при компиляции, а ошибку вы получите уже при исполнении.
В лиспе библиотека добавляет sql прямо в язык.
То есть вы можете прямо в лисп коде писать.
Причем будет проверка при компиляции.
В лисп таким образом можно добавить любой язык, пролог, опс, да черт возьми html (код html я здесь приводил)
Лисп вообще никаких барьеров в виде синтаксиса программисту не ставит.
Поэтому он является основным языком для исследований в области программирования, особенно в области ИИ.
К вашему сведению все эти прологи, опсы и прочая логическая лабуда разрабатывались на лиспе.
И уже позже переписывались на си для эффективности.
№ 451 19-07-2006 09:51 | |
Ответ на »сообщение 450« ()
___________________________
фактически так можно написать delphi программу при исполнении которой будет создаваться модель lisp программы, а потом исполняться.
В том что lisp можно написать на delphi нискто не сомневается.
№ 450 19-07-2006 03:22 | |
Ответ на »сообщение 444« (Jack Of Shadows)
Так например я не могу позволить себе написать
x := iif(a>10, LongFunction(a), EvenLongerFunction(a));
потому что дельфи возьмет и выполнит обе функции LongFunction и EvenLongerFunction
x:=TMyLongFunction(iif(a>10, LongFunction, EvenLongerFunction))(a); Сообщение не подписано
№ 449 19-07-2006 03:16 | |
Ответ на »сообщение 448« (Артем)
___________________________
Недостаток Forward chaining, по-моему, кроется в том, что пользователь может ввести некорректные правила. А же, как программист по 100 раз продумываю свои правила и более-менее в них уверен. Но, безусловно, Forward chaining тоже имеет право на жизнь. Только вот насчет количественного соотношения Forward и Backward chaining, думаю вы ошибаетесь.
№ 448 19-07-2006 03:09 | |
Ответ на »сообщение 446« (Jack Of Shadows)
___________________________
Да, а Forward chaining, насколько я понимаю, хорошо подходит для интерактивных экспертных систем. Просто, у меня другие задачи. Пролог я использую для анализа и преобразований текста, а также для реализации некоторых сложных реакций программы на внешние сигналы.
№ 447 19-07-2006 03:01 | |
Ответ на »сообщение 446« (Jack Of Shadows)
___________________________
Да, с iif я притормозил. :)
Насчет ленивых вычислений. В Лиспе они по умолчанию ленивые, или их надо специально обозначать таковыми (как в OCAML)?
№ 446 19-07-2006 02:47 | |
Ответ на »сообщение 445« (Артем)
___________________________
Там 2 и 3 параметры - это OUT параметры. Вы не можете запхать в них вызовы функций :)
Почему out ? in :))
Вот скажем функция iif
function IIF(Condition: Boolean; TrueString : String; FalseString: String = ''): String; overload;
begin
if Condition then
result := TrueString
else
result := FalseString;
end;
Там все три параметра in. Где вы там out увидели ?
2. Так, все-таки, Лисп может реализовать ленивые (отложенные) вычисления? Вы так и не ответили.
Простите, может конечно. Я это подраумевал, когда отвечал, и забыл.
Ой, ну давайте не будем. Я сейчас нарою в Интернете 20 названий разных интеллектуальных систем,
Да не надо нарывать никаких названий :))
Вот читайте, просвещайтесь:
http://en.wikipedia.org/wiki/Backward_chaining
http://en.wikipedia.org/wiki/Forward_chaining
Backward chaining is one of the two main methods of reasoning when using inference rules. The other is forward chaining.
Я просто удивлен что вы об этом не знали. Полагал что раз вы знакомы с прологом, то должны хотя бы знать общее положение дел в логическом программировании.
Ну, в таком случае, Вагиф, не мешало бы в вашем аккаунте добавить в строчки
Да, надо бы подновить. 100 лет назад писал, когда еще в Баку жил :))
№ 445 19-07-2006 01:48 | |
Ответ на »сообщение 444« (Jack Of Shadows)
___________________________
1. Чего-то вы перемудрили с
x := iif(a>10, LongFunction(a), EvenLongerFunction(a));
Там 2 и 3 параметры - это OUT параметры. Вы не можете запхать в них вызовы функций :)
2. Так, все-таки, Лисп может реализовать ленивые (отложенные) вычисления? Вы так и не ответили.
3. На вопрос, о причине создания кучи других ФЯ при наличии такого хорошего Лиспа вы ответили Потому что вам не нравится лисп :)) Серьезно, ведь вы не привели никаких аргументов против лиспа окромя "почему-то мне было противно, когда я его учил" Вообще, вы очень удачно отметаете неудобные вопросы.
4. Я например в своем сервере правил использую диалект OPS - KnowledgeWorks. При этом KnowledgeWorks имеет встроенный пролог в качестве языка запросов к базе знаний. Я выбрал эту систему именно потому что в ней реализованы оба подхода. То есть я могу решать весь спектр логических задач, а не только половину, доступную вам в прологе. Я вам советую ознакомиться с OPS, поскольку вы любитель логического программирования, и было бы жаль, если для вас осталось бы неизведанной огромная область (половина!!!) логического программирования. Ой, ну давайте не будем. Я сейчас нарою в Интернете 20 названий разных интеллектуальных систем, потом выберу какую-нибудь (не обязательно продукционный язык OPS) и скажу, что наконец-то смог решить весь спектр логических задач. Если серьезно, то в логическом программировании Пролог – это основной фундамент.
5. Я работал на лиспе с 1992 года. Не могу сказать точное число программ, но достаточно много. Особенно графику (Autocad) и GUI. Сейчас у нас в компании я на лиспе написал и веду сервер правил (rule engine) Ну, в таком случае, Вагиф, не мешало бы в вашем аккаунте добавить в строчки Увлечения: Delphi, теннис, фантастика, Го. и Работаю на Delphi, Java, C#, JavaScript добавить строчки о Лиспе (и об OPS тоже). Иначе мы будем думать, что вы нас обманываете. ;)
№ 444 18-07-2006 15:07 | |
Ответ на »сообщение 443« (Артем)
___________________________
Но, черт возьми, не нравится мне ваш Лисп :)
Вы не одиноки. Но здесь вам никто не будет навязывать один язык. Здесь речь идет вообще о всем семействе ФЯ.
Так что если кто то (я) хвалит лисп, это вовсе не означает что мы автоматически ругаем все остальные языки.
OCAML, ML, Haskell, Clean - все это прекрасные ФЯ.
1. Что вы думаете о ленивых и энергичных вычислениях в ФП вообще, и в Лиспе в частности?
Мне не нравится термин "ленивые", прелпочитаю "отложенные" как более точно передающий сущность механизма.
Никто не ленится выполнять инстуркции. Он просто отложены до момента когда потребуются (если потребуются вообще) :))
Механизм отложенных вычислений очень удобный для радикального упрощения записи многих алгоритмов.
Так например вы можете писать бесконечные циклы, не заботясь о том что компьютер зависнет на таком цикле, потому что на самом деле он никогда не будет выполняться до конца.
Или скажем вы можете сильно упрощать записи ветвлений.
Например я себе в дельфи сделал с десяток overloaded функций IIF(bool, val1, val2), которые в зависимости от первого значения (tru, false) возвращают второй или третий аргумент.
Очень удобные функции, но мне постоянно приходится напоминать себе что в дельфи нет отложенных вычислений, и нужно использовать iif с осторожностью. Забывчивость приводит к ужасным ошибкам.
Так например я не могу позволить себе написать
x := iif(a>10, LongFunction(a), EvenLongerFunction(a));
потому что дельфи возьмет и выполнит обе функции LongFunction и EvenLongerFunction
А вот в случае с хаскелем такая запись вполне корректна. Выполнится только одна из функций.
2. Почему, все-таки, если Лисп такой хороший, надо было изобретать кучу ФЯ?
Потому что вам не нравится лисп :)) Серьезно, ведь вы не привели никаких аргументов против лиспа окромя
"почему-то мне было противно, когда я его учил"
3. Что вы можете сказать о таких языках как Mercury, Clean, системе Mozart-Oz, Godel, Erlang?
Я не могу говорить о сотнях языков. Я знаю лисп, и немножко хаскель.
Остальные языки - милости прошу освещать тех кто на них работал.
Эта ветка не для меня лично. Не я один ОБЯЗАН толкать лекции о лиспе.
Вы можете толкать лекции о ocaml или о прологе. Буду только рад. :))
№ 443 18-07-2006 14:40 | |
Ответ на »сообщение 442« (Jack Of Shadows)
___________________________
ОК. Я не хочу конфронтации с вами, Jack of Shadows. В принципе, ваше чувство неудовлетворенности от использования стандартных ООП средств можно понять. Но, черт возьми, не нравится мне ваш Лисп :) Не скрою, я его знаю не очень хорошо – почему-то мне было противно, когда я его учил. Поэтому и переметнулся быстренько на OCAML.
Да, не могли бы вы ответить на пару моих вопросов?
1. Что вы думаете о ленивых и энергичных вычислениях в ФП вообще, и в Лиспе в частности?
2. Почему, все-таки, если Лисп такой хороший, надо было изобретать кучу ФЯ? Аргумент о сложности Лиспа и предназначенности только для очень умных людей прошу не применять, - Хаскель тоже довольно сложный язык.
3. Что вы можете сказать о таких языках как Mercury, Clean, системе Mozart-Oz, Godel, Erlang? Если вы с ними знакомы, какой вам понравился или не понравился, и почему?
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|