Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 402 30-06-2006 00:56 | |
Интересно, ввиду экзотичности всё же языка,
а как программировать, электронные ключи защиты?
В комплекте разработчика приведятся примеры
для сотни различных версий языков, но лиспа нет.
Изолированная вставка тут слабовата.
№ 401 29-06-2006 22:40 | |
Ответ на »сообщение 399« (Q. Werty)
___________________________
если почитать грехема, то там написано что лисп был придуман исключительно как более удобная замена машине тьюринга для описания алгоритмов. И только потом кто-то догадался, что на нем можно написать eval и транслировать во что-то исполнимое. Т.е. алгоритмы можно описывать и функционально.
кажется, вот:
http://paulgraham.com/rootsoflisp.html
№ 400 29-06-2006 12:10 | |
Ответ на »сообщение 399« (Q. Werty)
___________________________
И есть ли на этот счет какие-либо теоремы в математике?
Есть. Я уже говорил о том что математики доказали что машина Тьюрина и Lambda Calculus Черча, на которой строится ФП, абсолютно равнозначны.
Просто императивный подход принимает во внимание ограниченность рессурсов машины. Вы должны многократно использовать одни и те же ячейки памяти, потому что памяти мало и на всех не хватит.
В функциональном подходе принят идеалистический взгяд на вещи. Памяти море-океан. На каждую задачу можно отвести столько колько она захочет и НИКОГДА не освобождать обратно.
На самом деле конечно память освобождается, но не человеком. То есть программист об этом не думает, следовательно никогда память не освобождает.
Если это так, то сами определения алгоритма, которые традиционно даются в средней и высшей школе, должны быть подвергнуты коррекции с учетом функциональной парадигмы. Ведь все эти определения являются, по сути, императивными:
Вне всякого сомнения. Школа не может игнорировать движение прогресса и продолжать учить так как будто ее выпускники будут перфокартами огромный гроб кормить.
Соргласитесь есть огромная разница между алгоритмом быстрой сортировки, написанной в две строчки на хаскеле, и алгоритмом быстрой сортировки на СИ.
Разница в том что быстрая сортировка на хаскеле, быстра не только в исполнении, но и в написании и в чтении и в понимании.
А это сейчас гораздо более важно чем та жалкая горстка байтов, которую вам экономит алгоритм быстрой сортировки на СИ. Память дешевая. Время программиста дорого. Время - деньги.
№ 399 29-06-2006 11:55 | |
После некоторого знакомства с ФЯ возникают не только технические, но и "стратегические" вопросы. Для задач образования они, наверно, не менее важны. Попробую сформулировать некоторые неожиданные для меня выводы, а более опытные специалисты по ФЯ меня поправят, если что не так.
Итак.
1) Функциональное программирование - это просто другая парадигма программирования. Класс задач, решаемых с помощью этой парадигмы, не меньше, чем класс задач, решаемых на основе императивной модели. Другими словами, любая задача, имеющая решение в форме алгоритма, может быть описана в функциональной форме;
2) Программа на ФЯ - это множество определений функций, где результат вычисления не зависит от порядка записи этих определений. Существенным являются только значения аргументов и связи между функциями;
Можно ли из этого сделать вывод, что любой алгоритм обработки информации может быть выражен в форме множества функций, допускающих операции рекурсии и карринга, в котором сам порядок записи определений функций не имеет никакого значения? И есть ли на этот счет какие-либо теоремы в математике? Если это так, то сами определения алгоритма, которые традиционно даются в средней и высшей школе, должны быть подвергнуты коррекции с учетом функциональной парадигмы. Ведь все эти определения являются, по сути, императивными: алгоритм есть точно определенная ПОСЛЕДОВАТЕЛЬНОСТЬ действий и т.д., и т.п.
№ 398 29-06-2006 00:15 | |
Спасибо.
Просто не там искал :)
В форме библиотек в полной версии WinHugs действительно есть все, что надо, даже OpenGL. Жаль, что у ребят руки пока не дошли до визуальной cреды :(.
№ 397 28-06-2006 03:06 | |
№ 396 28-06-2006 02:58 | |
Ответ на »сообщение 392« (Q. Werty)
___________________________
main = t >> s
t = putStrLn "Числа Фибоначчи"
s = print ( map f [1..10] )
Кстати вы как раз таки использовали функциональную запись. Можно было гораздо проще - императивнее:
main = do
putStrLn "Числа Фибоначчи"
print ( map f [1..10] )
Как видите практически точная копия с любого ИЯ. И никаких >>
№ 395 28-06-2006 02:54 | |
Ответ на »сообщение 392« (Q. Werty)
___________________________
Какая в функциональных языках используется "идеология" для создания элементов графического интерфейса? Человеку, испорченному визуальными и компонентными средами, этот вопрос тоже с ходу не дается :))
Построители GUI не имеют никакого отношение к ФЯ или ИЯ.
Есть ИЯ с визуальным дизайнером форм (Дельфи, VS). Есть ИЯ без визуального дизайнера форм (с, с++, pascal)
Так что вам нужно смотреть на наличие конкретных инструментов для языка который вы выбрали.
Для оиспа визуальные построители есть. Например можете скачать бесплатную epress version Allegro 8
с сайта franz.com
Там визуальная среда похожая а дельфи. Т.е. сверху панель компонент, сбоку редактор свойств, посередине форма.
В хаскеле такой визуальной среды нет (пока) Там GUI делают ручками посредством таких билиотек как скажем http://wxhaskell.sourceforge.net/
С другой стороны, любая "нормальная" программа - это все-таки какая-то определенная последовательность действий
"Нормальная" программа на самом деле это две части - часть в которой описывается последовательность действий, и часть в которой описываются обьекты, функции, и их взаимосвязи.
Вот кстати в вашем примере вы уже не заметили как нарушили императивность, т.е. последовательность.
s = print ( map f [1..10] )
f :: Int -> Int
f 1 = 1
f 2 = 1
f n = f(n-1) + f(n-2)
Ведь вы используете функцию f ДО ее описания. Императивный язык вам этого не позволит. Там вы действительно должны четко соблюдать последовательность.
По мере ващего продвижения вы станете замечать что императивная часть, то есть часть с жесткой последовательностью исполнения будет становиться все меньше и меньше на фоне общего обьема кода в программе.
№ 394 28-06-2006 02:29 | |
Ответ на »сообщение 392« (Q. Werty)
___________________________
Какая в функциональных языках используется "идеология" для создания элементов графического интерфейса? Человеку, испорченному визуальными и компонентными средами, этот вопрос тоже с ходу не дается :))
Вы не читали сообщение 313 ?
№ 393 28-06-2006 02:22 | |
Ответ на »сообщение 392« (Q. Werty)
___________________________
С другой стороны, любая "нормальная" программа - это все-таки какая-то определенная последовательность действий - сначала пользователь открывает какую-то форму, потом заполняет поля, потом нажимает кнопку, потом программа вычисляет что-то одно, потом что-то другое и т.д. Как при этом можно обходится без четкого указания что должно следовать за чем, т.е. без "императивности". Пока это не очень понятно.
Все не совсем так. Современный пользовательский интерфейс ориентирован на события, т.е. исключает строгую последовательность действий. Вы можете попытаться заставить пользователя выполнять все действия в строго оговоренной последовательности, но такое применяется крайне редко (даже обычные визарды дают несколько возможностей: вперед, назад, отмена).
Так что GUI-программа на языке программирования высокого уровня представляет собой как раз отсутствие четкой последовательности действий.
Другое дело, что как правило обработчики событий часто ориентированы на изменение состояния программы.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|