Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 2022 24-02-2007 12:05 | |
Ответ на »сообщение 2021« (AVC)
___________________________
Заметьте, что мы гоняем один и тот же список три раза (фильтруем left middle right), хотя можно все три части получить за один прогон.
Напишите функцию distill которая принимает эталон и список и возвращает три списка left middle right за один рекурсивный прогон.
А потом уже эту функцию можно использовать в sort
Это покажет вам как в лиспе можно возвращать (и соответственно принимать) сразу несколько значений.
№ 2021 24-02-2007 11:38 | |
Ответ на »сообщение 2020« (Jack Of Shadows)
___________________________
>>>Я так полагаю вы filter тоже для изучения написали, поскольку в схеме фильтры есть.
Честно говоря, написал просто по незнанию (DrScheme "не узнал" remove-if, а других фильтров я еще не знаю).
Но у меня уже был образец (да-да, "паттерн" :) ) в виде уже написанной функции map, так что написание фильтра -- не проблема.
Вот понимание того, как пишется сортировка, -- шаг вперед (пусть и небольшой).
Для меня сейчас главная неосвоенная область в Схеме -- структуры данных и работа с ними.
№ 2020 24-02-2007 10:53 | |
Ответ на »сообщение 2019« (AVC)
___________________________
Что-то мне подсказывает, что Ваш вариант будет выкидывать из списка повторяющиеся элементы. :)
Правильно, но это легко лечится.
Вместо того чтобы брать 1 головной элемент (z (car x)
надо брать все элементы подобные головному (z (remove-if #'(lambda (y) (/= y (car x))) x)
Я так полагаю вы filter тоже для изучения написали, поскольку в схеме фильтры есть.
№ 2019 24-02-2007 07:27 | |
Ответ на »сообщение 2012« (Jack Of Shadows)
___________________________
Ответ на »сообщение 2011« (AVC)
___________________________
(defun my-sort (x)
(if x (let* ((z (car x))
(left (remove-if #'(lambda (y) (>= y z)) x))
(right (remove-if #'(lambda (y) (<= y z)) x)))
(append (my-sort left) (list z) (my-sort right)))
nil))
Это лисп. На схему думаю вам не трудно будет перевести.
После короткого солдатского сна получилось примерно так: (define (filter f x)
(cond
((null? x) ())
((f (car x)) (cons (car x) (filter f (cdr x))))
(else (filter f (cdr x)))))
(define (my-sort x)
(define (sort-if-not-empty x)
(define z (car x))
(define left (filter (lambda (y) (<= y z)) (cdr x)))
(define right (filter (lambda (y) (> y z)) (cdr x)))
(append (my-sort left) (list z) (my-sort right)))
(if (null? x) () (sort-if-not-empty x)))
Что-то мне подсказывает, что Ваш вариант будет выкидывать из списка повторяющиеся элементы. :)
№ 2018 24-02-2007 03:20 | |
Ответ на »сообщение 2017« (Geniepro)
___________________________
Я вообще о возможности обрабатывать опреации в списке.
Конечно такие выверты могут понадобиться в редких случаях.
Например при генерации последовательности операций на лету.
А для обычных программ лучше пользоваться удобной do нотацией
№ 2017 24-02-2007 03:13 | |
Ответ на »сообщение 2005« (Jack Of Shadows)
___________________________
Ща попробую чтобы то результат первого действия использовался в следующем итд.
А чем Вас такой вариант не устраивает? ;о)
readFile "tmp/x" >>= writeFile "tmp/y"
№ 2016 24-02-2007 02:56 | |
Ответ на »сообщение 2015« (Geniepro)
___________________________
Вы хотите сказать, что идеи языка Self были перенесены в JavaScript?
Идея языка Self это Prototype based OOP.
Эта идея реализована в javascript, ну и конечно же в лиспе.
Примеры я уже здесь приводил.
№ 2015 24-02-2007 02:44 | |
Ответ на »сообщение 1995« (Jack Of Shadows)
___________________________
>>> позабытому, увы, ОО-языку Self,
Почему позабытому ? Наоборот один из самых популярных и широко распространенных языков...только под именем javascript :))
Вы хотите сказать, что идеи языка Self были перенесены в JavaScript?
№ 2014 24-02-2007 02:43 | |
Ответ на »сообщение 1981« (Илья Ермаков)
___________________________
Не жизнь - а малина, так что не надо нас, убогих оберонщиков, жалеть :-)
Как там говаривал высокомудрый Козьма Прутков?
"Кому и горький хрен малина, а мне и бланманже - полынь!" :о))
№ 2013 24-02-2007 00:21 | |
Ответ на »сообщение 2012« (Jack Of Shadows)
___________________________
Ответ на »сообщение 2011« (AVC)
___________________________
(defun my-sort (x)
(if x (let* ((z (car x))
(left (remove-if #'(lambda (y) (>= y z)) x))
(right (remove-if #'(lambda (y) (<= y z)) x)))
(append (my-sort left) (list z) (my-sort right)))
nil))
Спасибо, идея понятна (близко к quick sort).
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|