Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 3112 04-10-2007 01:30 | |
Хочу задать практический вопрос.
В книге горячих финских парней "Мир лиспа", том 1 в качестве упражнения предлагается решить на Common Lisp-е следующую задачку:
"Определите функцию (НАЗОВИ x y), которая определяет функцию с именем, заданным аргументом x, и лямбда-выражением y. Определите с помощью этой функции функцию, вычисляющую сумму квадратов двух чисел, и саму функцию НАЗОВИ"
Поскольку с русским в clisp-е вроде проблемы, то "(НАЗОВИ x y)" я для простоты заменил на "(create_fn n la)" и определил эту функцию так:
(defun create_fn (n la) (eval (cons 'defun (cons n (cdr la)))))
пример использования:
(create_fn 'sum_sqr '(lambda (x y) (+ (* x x) (* y y))))
SUM_SQR
(sum_sqr 2 3)
13
Но как-то не нравится мне мое решение "составить список и вычислить его через eval" с эстетической точки зрения. Может ли решить эту задачу поэлегантней?
№ 3111 03-10-2007 20:01 | |
Ответ на »сообщение 3110« (Илья Ермаков)
___________________________
Ну это все равно что императивщики сейчас стали бы сравнивать варианты кода с for, while, repeat, foreach. Причем с ходу и невозможно удет сказать какой вариант лучше :))
Только у вас вариативность в операторах а у нас (за неимением операторов) в функциях и их декларациях.
А так - тоже самое.
Далее разница приведенного хаскелевского кода на оберон скажем будет переводиться так:
if x > 0 then
y := true
else
y := false;
Супротив
y := (x > 0)
Видите, тоже два варианта написания одного и того же, но на императивном языке. Вы же в этих вариантах не путаетесь ? И можете сразу выбрать что вам больше по душе ?
№ 3110 03-10-2007 19:02 | |
Ответ на »сообщение 3105« (Jack Of Shadows)
___________________________
Ответ на »сообщение 3098« (Илья Ермаков)
___________________________
Хаскель это практически псевдо-язык. Настолько легок что запонимается намертво. Уступает в этом разве что только лиспу.
Что сам язык очень прост, я как раз понял.
Однако несмотря и отчасти благодаря этому обвязка весьма и весьма навороченная... И вариации её использования.
Посмотрите, на одну и ту же задачу в этой ветке наперегонки приводится два, три а то и четыре варианта. При этом в большинстве случаев трудно выделить какой-то один лучший. Трудно однозначно сказать, о чём это говорит. Но мне кажется, что для технического инструмента это скорее недостаток, чем достоинство.
№ 3109 03-10-2007 18:58 | |
Ответ на »сообщение 3107« (Jack Of Shadows)
___________________________
Ответ на »сообщение 3105« (Jack Of Shadows)
___________________________
запонимается намертво Приколистая опечатка :))
Читаю электронную книжку Непейводы, Скопина "Основания программирования".
Слово "англо-американский". Внизу страницы восторженная сноска от авторов:
"Это слово система проверки правописания предложила заменить на "нагло-американский".
№ 3108 03-10-2007 18:55 | |
Ответ на »сообщение 3106« (Jack Of Shadows)
___________________________
Ответ на »сообщение 3104« (Илья Ермаков)
___________________________
через годик практики рефала конечно
Побачим, насколько легко реализуется рантайм рефала :-) На КП в ББ...
№ 3107 03-10-2007 18:20 | |
Ответ на »сообщение 3105« (Jack Of Shadows)
___________________________
запонимается намертво Приколистая опечатка :))
№ 3106 03-10-2007 18:18 | |
Ответ на »сообщение 3104« (Илья Ермаков)
___________________________
Знаете, я код на Рефале и основы программирования на нём стал разбирать первый раз сегодня утром. У меня уже есть полное представление о том, КАК писать программы на этом языке и ДЛЯ ЧЕГО его можно эффектно применить.
Вот и отлично. Рефал, хаскель, erlang, лисп, ocaml - какая разница. Принципы везде одинаковые. Отличаются мелочами да синтаксисом. Раз освоив приемы ФП на рефале вам на остальные языки (через годик практики рефала конечно) будет гораздо легче смотреть. И на хаскель тоже :))
№ 3105 03-10-2007 18:15 | |
Ответ на »сообщение 3098« (Илья Ермаков)
___________________________
Кстати, интересно, а присутствует ли у Хаскелла типичный, например, для С++ эффект, когда после долгой паузы в работе с языком (полгода-год) начинаешь местами путаться в коде и долго спотыкаешься о подзабытые детали?
Я с хаскелем вообще не работаю. И код не вижу месяцами иногда. И тем не менее вот этот вот палиндром накропал в нотепаде меньше чем за минуту.
Хаскель это практически псевдо-язык. Настолько легок что запонимается намертво. Уступает в этом разве что только лиспу.
№ 3104 03-10-2007 18:10 | |
Ответ на »сообщение 3101« (Geniepro)
___________________________
Ответ на »сообщение 3097« (Илья Ермаков)
___________________________
Так и что же тут чудовищно сложного и непонятного, а потому и не запоминаемого? Ваш код на Рефале немногим лучше регэкспов Перла...
Знаете, я код на Рефале и основы программирования на нём стал разбирать первый раз сегодня утром. У меня уже есть полное представление о том, КАК писать программы на этом языке и ДЛЯ ЧЕГО его можно эффектно применить.
Относительно Хаскелла я у себя в голове так и не смог утрясти эти вопросы. Нет, я прекрасно понимаю, что есть самый надёжный путь, по Маяковскому - "сядь на собственные ягодицы и катись". Вот именно таким и только таким путём осваивается С++.
Однако, кроме отсутсвия времени на эксперименты из любопытства, у меня есть сложившееся предпочтение к тем идеям, которые доступны для понимания без погружения в процесс их использования... В конце концов, мы же с формальными системами работаем, а не ботинки примеряем.
Вы знаете, до того, как я написал на практике первую программу на Обероне, я месяца полтора проделывал это в уме, "в параллель" с кодом на С++, и мне для этого хватило двух просмотров описания языка.
№ 3103 03-10-2007 18:06 | |
Ответ на »сообщение 3099« (Geniepro)
___________________________
Вроде какой то мужик написал ListLike интерфейсы ко многим типам списков, включая стандартные List и ByteString, PackedString итд
http://software.complete.org/listlike
Ещё недостаток - нет конструктора типа наподобие (:), но цепляющий новый элемент не к началу списка, а к концу его, соответственно паттерн матчинг можно было бы проводить более удобно.
Да pattern matching можно сделать и помощнее. Помоему какие то эксперименты они с этим проделывают. Основная проблема - для цепляния к концу списка нужно прогонять список до конца, что весьма накладно и сильно скажется на производительности всего механизма pattern matching. Может поэтому они с эти не торопяться. Ищут приемлимый выход.
А подобные pattern match-и народ делает сам. Например HSP (Haskel Server Pages) включает в себя библиотеку HaRP (Haskell Regular Patterns). Который как раз позволяет сопоставлять используя regexp. То есть практически как душе угодно.
Скажем наш палиндром при их помощи можно записать точно также как и на рефале:
palindrom [ ] = True
palindrom [_] = True
palindrom [x, m@:_*, x] = palindrom m
palindrom _ = False
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|