Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение 
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 792 17-08-2006 04:13 |  |
Ответ на »сообщение 790« (SJ)
___________________________
функция в ФЯ не имеет побочных эффектов, т.е. в определенном смысле инкапсулирует свою логику вычисления. На основе одних функций можно определять новые (расширение функций, т.е. в определенном смысле наследование?)
Ну, вы эквилибрист, однако. :)
№ 791 17-08-2006 02:47 |  |
Ответ на »сообщение 782« (info21)
___________________________
Не совсем в тему, но пусть уж для статистики:
я отказался от всяких таких попыток (типа на ФЯ алгебру, привинтить ИЯ для быстроты, т.к. невмоготу неделями ждать, когда своппинг начинается; или наоборот -- к числодробилке на ИЯ привинтить "ум" на ФЯ).
Чушь все это. Мираж. Понять полезно, а использовать -- на фиг.
Keep it simple -- stick to Oberon.
Господа! Давайте не впадать в крайности. Неужели вы не понимаете, что взаимное отрицание ООП и декларативного программирования по сути своей контрпродуктивно? На декларативных (функциональных и логических) языках гораздо удобнее решать задачи, алгоритм работы которых сводится к комбинации формул, описывающих фрагменты общей системы. Я уже приводил в качестве примера статью http://delphikingdom.ru/asp/viewitem.asp?catalogid=1168 с макетом интерпретатора скриптового языка на основе Lisp. Это, просто, иллюстрация того, что некоторые задачи (программа "Ферзи" из статьи) лучше описывать именно на декларативном языке. К этим задачам можно отнести и программирование алгоритмического ядра разнообразных игрушек, и синтаксический разбор, и преобразование струткур и т.д.и т.п. Я лично не так давно начал пользоваться связкой Delphi+Prolog (попробуйте бесплатную реализацию http://www.swi-prolog.org и интерфейс к Delphi http://gollem.science.uva.nl/twiki/pl/bin/view/Foreign/DelphiInterface ). Еще присматриваюсь к возможности взаимодействия .net-сброк и SICSTUS-Prolog.
Вообще, Microsoft.net предоставляет хороший механизм для взаимодействия разнообразных языков. Тот факт, что техника смешивания в одном проекте еще не получила широкого распространения, можно объяснить относительной молодостью самого .net и некоторой инерцией программистского сообщества.
№ 790 17-08-2006 02:10 |  |
1) Единственный пример "взаимодействия миров" у меня был такой. Замучился с красивым оформлением вывода результатов на Haskell. Забил на это дело - сделал вывод из модуля Haskell в текстовый файл в формате HTML. А потом обычным образом смотришь HTML-документ и наслаждаешься :).
Keep it simple - stick to haskell&HTML/XML :)))))
2)Кстати, чтобы не уходить в сторону от темы, у меня вопрос.
А что является аналогом ООП в функциональных языках?
Или, точнее говоря, что является аналогом класса?
Функция?
Инкапсуляция вроде присутствует - функция в ФЯ не имеет побочных эффектов, т.е. в определенном смысле инкапсулирует свою логику вычисления. На основе одних функций можно определять новые (расширение функций, т.е. в определенном смысле наследование?).
№ 789 17-08-2006 01:32 |  |
>>>в некоторых языках число, это объект. просто неизменяемый. Его
>>>состояние и идентичность совпадают.
Конечно! Поэтому я специально выделил, что говорил о целочисленном типе данных в "классическом" смысле слова. А если в языке все является классом, то ситуация меняется. Любой тип данных является классом, но вот классы бывают разные. Соответственно есть разные экземпляры классов (объекты) и у них могут быть разные типы. Типы не в смысле "типа данных", а в смысле "типа объекта". Тип данных у всех объектов один - это класс.
№ 788 17-08-2006 01:25 |  |
>>>Насчёт того, что тип данных и тип объекта -- совершенно разные
>>>понятия, я бы не стал столь категорично заявлять.
Проблема еще и в том что в русском и даже в английском языках не хватает слов, чтобы вместить туда все многообразие человеческих мыслей. Слова "тип" и "класс" тоже оказались слишком "узкими".
Судите сами. Вот два утверждения.
"Треугольник" принадлежит к типу "Многоугольники".
"Треугольник" принадлежит к классу "Многоугольники".
Если мы считаем, что по смыслу эти высказывания равнозначны, то надо признать, что в слова "тип" и "класс" мы вкладываем одинаковый смысл. А если нет, тогда в чем мы видим разницу?
№ 787 17-08-2006 01:14 |  |
Ответ на »сообщение 786« (SJ)
___________________________
в некоторых языках число, это объект. просто неизменяемый. Его состояние и идентичность совпадают.
№ 786 17-08-2006 00:59 |  |
>>>Насчёт того, что тип данных и тип объекта -- совершенно разные
>>>понятия, я бы не стал столь категорично заявлять.
Смешно, когда спорят с очевидным. Давайте возьмем целочисленный тип данных, например, Integer (или Int). Экземпляр этого типа данных - это любая целочисленная переменная. НЕ ОБЪЕКТ, а ПРОСТАЯ ПЕРЕМЕННАЯ ВЕЛИЧИНА. О каком типе объекта мы можем говорить здесь, где вообще нет никакого объекта? А о типе данных можно говорить! Или Вы не слышали, что есть такой тип данных Integer? И после этого Вы будете сомневаться, что тип данных и тип объекта это разные понятия?
>>>И что это за "определённые свойства" такие у этого АТД, что делают
>>>его классом?!
Ну, например свойство определять новые типы на основе ранее определенных. Слышали о таком свойстве? Может не будем опять обсуждать вопрос, что должно быть у типа данных, чтобы он мог называться классом?
№ 785 17-08-2006 00:47 |  |
Ответ на »сообщение 783« (Jack Of Shadows)
___________________________
В SML.NET есть пример - игра Конвея Life.
Там интерфейсная часть на C# сделана, а сам расчёт учёта соседей и тд. - на SML.
Оформлено всё это в виде двух солюшнов - один на C#, другой на SML...
На SML - сервер в виде DLL.
ЗЫ. Что-то вроде несложная задачка, а начинает так жутко тормозить уже на поле размером 128х128...
№ 784 17-08-2006 00:41 |  |
>>> <Строка> ::= <Символ> {<Символ>}
>>>То, что взято в фигурные скобки, повторяется 0 или большее число
>>>раз. По-вашему, это недостаточно строгое определение?
Вы забываете, что предмет в фигурных скобках - это и есть рекурсия. Только Вы ее не обозначаете явно, а только подразумеваете.
Ваши фигурные скобки есть не что иное, как рекурсия следующего вида:
{Символ} ::= <пусто> | {Символ}Символ
где <пусто> ::=
От того, что мы можем договориться и не обозначать рекурсивное определение предмета в явной форме, а использовать для этого какие-то специальные метасимволы, рекурсивная суть предмета не исчезает.
№ 783 16-08-2006 21:41 |  |
Ответ на »сообщение 782« (info21)
___________________________
Кстати согласен. Тоже были мысли GUI на dotnet рисовать а логику на лиспе.
Однако быстренько сообразил что легче все на одном языке делать.
Keep it simple - stick to lisp :))
Добавить свое сообщение
Отслеживать это обсуждение 
Дополнительная навигация: |
|