Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 2172 23-03-2007 17:11 | |
Ответ на »сообщение 2170« (Булат Зиганшин)
___________________________
Мне легче, я эту ветку начинал :))
Кстати, почему delphikingdom ? Насколько я понял ты к дельфям никакого отношения не имеешь.
№ 2171 23-03-2007 16:47 | |
Ответ на »сообщение 2170« (Булат Зиганшин)
___________________________
а ты бы на моём месте конечно, прочёл бы её всю, от первого сообщения? :)))
Компания правильная подбирается здесь.
№ 2170 23-03-2007 16:30 | |
Ответ на »сообщение 2169« (Jack Of Shadows)
___________________________
Ответ на »сообщение 2168« (Булат Зиганшин)
___________________________
Я понял. Булат Зиганшин наткнулся на эту ветку и стал читать (и заодно отвечать на) ее сверху вниз, от последних сообщений назад по времени. :))
Хехе, пошла рекурсия :))
а ты бы на моём месте конечно, прочёл бы её всю, от первого сообщения? :)))
№ 2169 23-03-2007 16:17 | |
Ответ на »сообщение 2168« (Булат Зиганшин)
___________________________
Я понял. Булат Зиганшин наткнулся на эту ветку и стал читать (и заодно отвечать на) ее сверху вниз, от последних сообщений назад по времени. :))
Хехе, пошла рекурсия :))
№ 2168 23-03-2007 16:06 | |
Ответ на »сообщение 2060« (AVC)
___________________________
Читаю (по возможности) SICP.
Немного смущает, что к 3-й главе ФП практически заканчивается, и начинается "злой императив" (set! и т.п.).
Функциональный способ инкапсуляции объектов (модель вычислений с "окружениями"/замыканиями) остроумен, но не вполне ясно, что же мы выигрываем по сравнению с "обычным" ООП, перейдя на "императивные рельсы".
(Это не критика, просто хочется услышать мнение других людей.)
значит, дальше надо курить другую траву :) конкретного ничего не подскажу, извини
№ 2167 23-03-2007 15:57 | |
Ответ на »сообщение 2083« (Geniepro)
___________________________
То есть, если на экран выводится число 5600 или число 0 - то это совершенно одно и то же? Нет никакой разницы в видимом поведении?
а тебе не приходит в голову, что *любые* оптимизации влияют на время выполнения? ;)
№ 2166 23-03-2007 15:47 | |
Ответ на »сообщение 2162« (AVC)
___________________________
Я не придираюсь, просто не вижу рекурсии, и неясно, что такое partition.
Правильно не видите. там очепятка.
qsort [] = []
qsort (x:xs) = (qsort lesser) ++ [x] ++ (qsort greater)
where (lesser,greater) = partition (<x) xs
№ 2165 23-03-2007 15:43 | |
Ответ на »сообщение 2160« (AVC)
___________________________
На все вопросы по хаскелю есть: http://haskell.org/hoogle/
partition это функция которая принимает списко и функцию. И возвращает 2 списка один - удовлетворяющий условию, другой нет.
№ 2164 23-03-2007 15:42 | |
Ответ на »сообщение 2103« (Илья Ермаков)
___________________________
Для любой задачи, хотя бы на динамическое программирование, в условиях жесткого ограничения на время выполнения, вам сразу потребуется введение шагов и запоминание промежуточных результатов. Придется писать монады. И размер кода сразу подастся в значительно большую сторону, как и возможность наляпать ошибок :-)
в случае жётских ограничений на время выполнения я бы использовал С или как минимум ocaml. если же речь идёт об O времени работы, то прочти Purely Functional Data Structures [ http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf] - неизменяемые структуры данных имеют свои особенности, не стоит о них всех судить по одним спискам :)
№ 2163 23-03-2007 15:16 | |
Ответ на »сообщение 2105« (Илья Ермаков)
___________________________
Смысл запоминания промежуточного результата в том, чтобы потом многократно его использовать. Если он записан в виде функции, то перерасчет будет производиться многократно.
есть memoizing. если каждое значение запомнено в какой-то ленивой структуре данных, то оно будет вычислять только однократно, при первом использовании. пример со списком:
fib :: [Int]
fib = 1 : 1 : zipWith (+) fib (tail fib)
с массивом:
powers_of_2 :: Array Int Integer
powers_of_2 = listArray (0,100) (iterate (2*) 1)
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|