Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 2012 24-02-2007 00:09 | |
Ответ на »сообщение 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))
Это лисп. На схему думаю вам не трудно будет перевести.
Как писать в функциональном стиле.
1. Никогда не менять исходный список. Всегда создавать новый.
2. Всегда создавать рекурсивно, никаких копирований в новую структуру и работе в ней.
Это конечно один из многих алгоритмов.
Можно по разному сортировать, например merge-sort.
№ 2011 23-02-2007 23:34 | |
Ответ на »сообщение 2010« (AVC)
___________________________
Если игнорировать алгоритм, то вопрос в следующем: как написать сортировку в функциональном стиле?
Когда мы пишем сортировку на ИЯ, то меняем исходный массив (список и т.п.).
Для ФЯ это вряд ли хорошо.
Поэтому, вероятно, следует формировать второй список, а потом его вернуть.
Но остается та проблема, что неудобно (и неэффективно) писать алгоритм сортировки, совершенно не меняя исходной структуры.
Значит, перед тем, как заняться сортировкой имеет смысл скопировать исходную структуру в новую (промежуточную), от которой потом отрывать по кусочку...
Короче, не совсем ясно.
Правда, может быть я устал и не вижу какого-то совершенно очевидного решения.
№ 2010 23-02-2007 22:32 | |
Как на Схеме пишутся сортировки? (Вообще работа со структурами данных.)
Пытаюсь угадать, сделал набросок (на алгоритм сейчас наплевать), но такое чувство, что получилось ужасно!
; поменять местами элементы в списке
(define (swap x L R)
(define temp (list-ref x L))
(set-car! (list-tail x L) (list-ref x R))
(set-car! (list-tail x R) temp))
; моя самая первая сортировка на ФЯ -- ужасно!!
(define (sort x)
(define n (length x))
(define (sort-iter i)
(cond
((and (< 0 i) (> (list-ref x (- i 1)) (list-ref x i)))
(swap x (- i 1) i)
(sort-iter (- i 1)))
))
(define (loop right)
(cond
((< right n) (sort-iter right) (loop (+ right 1)))))
(loop 1)
x)
№ 2009 23-02-2007 19:09 | |
№ 2008 23-02-2007 19:06 | |
№ 2007 23-02-2007 19:02 | |
Ответ на »сообщение 1980« (Geniepro)
___________________________
Ответ на »сообщение 1976« (AVC)
___________________________
>>>Так что за ссылку -- персональное спасибо Geniepro!
Завсегда пожалуйста! Надеюсь, Вы всё таки не забросите эту игрушку, а хотя бы время от времени будете уделять ей время! ;о)
Авось пригодится? Классика, как-никак...
Нет, не заброшу. Напротив, как только есть минутка -- стараюсь что-нибудь накропать на Схеме.
Пока что осилил понятие блочной структуры (взятой из Алгола), подстановочной (substitution) модели вычислений и связанное с ней понятие хвостовой рекурсии. (Повторюсь, я начинающий.)
Был приятно удивлен, осознав, что благодаря хвостовой рекурсии в Схеме есть аналог цикла.
Накропал итеративную версию для чисел Фибоначчи. ; Вычисление числа Фибоначчи с помощью хвостовой рекурсии.
(define (fib-iter n)
(define (iter a b n)
(cond
((= n 0) b)
(else (iter b (+ a b) (- n 1)))))
(iter 0 1 (- n 1))) Небольшую задержку стал ощущать только при (fib-iter 100000).
Зато хорошо осознал, что кролики -- не только ценный мех, но и чудовищная сила размножения. :)
(Говорят, что числа Фибоначчи восходят к моделированию размножения кроликов.)
Если получится освоить (хотя бы в какой-то степени) ФП, то надеюсь, что нам станет гораздо легче находить общий язык.
Предполагаю, что основные проблемы поджидают меня в структурах данных.
Если бы Вы ещё поигрались бы с Хаскеллом - ещё замечательнее стало бы! Мозгам полезно получать встряску время от времени, шаблоны ломать...
С Хаскелем уже пробовал, как-то не пошло...
Возможно, лично мне лучше начинать именно со Схемы, а потом вернуться к Хаскелю.
№ 2006 23-02-2007 18:51 | |
Мне тут на #haskell уже даже код подкинули:
http://hpaste.org/629
Там как раз императивные операции в списке, причем следующая использует результат предыдущей.
Ну силен хаскель :))
№ 2005 23-02-2007 18:45 | |
Хехе
sequence_ [readFile "C:/Dev/Haskell/Fibonacci.hs" , writeFile "d:/Fibonacci.hs" "foo" >> return ""]
Работат :))
Главное приводить к одному типу.
Ща попробую чтобы то результат первого действия использовался в следующем итд.
№ 2004 23-02-2007 17:15 | |
Ответ на »сообщение 1999« (Илья Ермаков)
___________________________
Взгляните на программу как на осязаемую в "железных" понятиях схему - и поймете сущность Оберона.
Кстати, мне приходилось разрабатывать приборы, и некоторые из них противоречили одному из требований Оберонов: модули должны быть в единственном экземпляре.
Мне как-раз приходилось делать приборы, в которых было по нескольку одинаковых модулей, работающих параллельно, и общающихся по общей шине с центральным управляющим модулем...
ЗЫ. Эх, не достался мне 2000-й пост... :о))
№ 2003 23-02-2007 16:58 | |
"The Pros and Cons of Teaching Purely Functional Programming in First Year"
Manuel M. T. Chakravarty & Gabriele Keller
Авторы статьи на основании своего успешного опыта обучения Хаскеллу студентов-первогодков (классы до 600 студентов - размах у них там нехилый!) обосновывают правильность выбранного ими подхода.
Они уверены в том, что изучение Хаскелла способствует достижению принципиальных целей обучения:
1. Представление элементарных методов программирования (практический аспект).
2. Введение в важные понятия обработки информации (теоретический аспект).
3. Вырабатывание аналитического мышления и навыков решения задач (методологический аспект).
Облегчённый и ортогональный синтаксис Хаскелла помогает отодвинуть особенности синтаксиса на задний план и сконцентрироваться на общих концепциях программирования. Очевидно, что это помогает быстро приступить к интересным темам и задачам. Краткий синтаксис и высокая выразительность современных функциональных языков - существенное преимущество при обработке структур данных.
...ну и так далее в том же духе :о))...
Кстати, там обсуждается и такая проблема обучения функциональному программированию, как несоответствие распространённых языков изученным знаниям по ФП. Такие важные составляющие ФП, как list comprehension, каррирование, функции высшего порядка и лямбда-выражения, отсутствуют в большинстве языков...
На такие упрёки предлагается давать следующие контраргументы: убеждение студентов, что фундаментальные знания гораздо важнее знания отдельных языков; явное обсуждение существующих "реальных применений" функциональных языков; и акцент на практических аспектах, таких как программирование ввода/вывода, подчёркивание связи с другими языками и курсами...
В конечном счёте эти аргументы вполне убеждают сомневающихся в необходимости изучения функционального программирования...
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|