Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 262 19-06-2006 23:48 | |
Ответ на »сообщение 261« (panda)
___________________________
TListItem = record
Value: Integer;
Next: PListItem;
Jack, или перестаньте паясничать,
Судя по приведенному примеру паясничаете вы а не я.
Я вам приводил примеры работы со списком, используемые повсеместно.
Вы же мне в ответ какую то кунсткамеру привели.
Этого уродца только в цирке показывать. Как вы будете в такой доморощенный список добавлять элементы ?
Как будете удалять ?
Приведите прием применяемый на практике. Быстро выяснится что вам придется написать половину функциональности лиспа, чтобы сделать такой подход практичным.
Где вы видели на практике в ИЯ применение такого подхода для работы со списками ?
или выражайте свои мысли абсолютно точно.
Мы говорим о том что легко/трудно а не о том что возможно/невозможно.
Ваш пример доказывает возможность (в которой никто не сомневался) и великолепно показывает громоздкость такого подхода по сравнению с простым циклом.
Никто просто не будет морочить себе голову.
О том и речь, рекурсия в ИЯ непрактична.
№ 261 19-06-2006 22:08 | |
Ответ на »сообщение 259« (Jack Of Shadows)
___________________________
Если приведете пример рекурсивного кода в ИЯ, работающего со списком по методу первый-остальные, то можно будет обсудить. А так я честно говоря не представляю себе.
Jack, или перестаньте паясничать, или выражайте свои мысли абсолютно точно.
type
PListItem = ^TListItem;
TListItem = record
Value: Integer;
Next: PListItem;
end;
function Sum(List: PlistItem): Integer;
begin
if List = nil then
Result := 0
else
Result := List.Value + Sum(List.Next);
end;
№ 260 19-06-2006 19:02 | |
Ответ на »сообщение 258« (hugi)
___________________________
вопрос о том, почему Вы называете работу со списками в ФП работой "напрямую", а в ИП -- "не напрямую"?
Потому что в рекурсивном подходе нет нужды пользоваться дополнительными переменными, в которых надо запоминать номер обрабатываемого элемента, информация, которая не имеет никакого отношения к ни к алгоритму обработки списка, ни к самому списку. Скорее к внешней конструкции, которая как паучок бежит по списку.
При этом эта внешняя конструкция (цикл) должна обслуживать себя, кроме того чтобы выполнять возложенную на нее работу. А поскольку этим в конечном итоге должен заниматься человек, то и получается что он работает не напрямую со списком, а с конструкцией (итератором) которая бежит по списку.
В рекурсивном решении такая конструкция отсутствует. Вы работаете со списком и более ни с чем.
Однако вы уже говорили что удобство работы со списком рекурсивно или итеративно - понятие субьективное.
Мне нравится одно - вам другое.
№ 259 19-06-2006 18:55 | |
Ответ на »сообщение 258« (hugi)
___________________________
Как видите tail указывает на оставшуюся часть списка, а head -- на первый элемент. Единственное, что, возможно, придётся сделать, это разорвать связь между El1 и El2. Хотя и это не потребуется, если делать всё в духе ФЯ.
Если приведете пример рекурсивного кода в ИЯ, работающего со списком по методу первый-остальные, то можно будет обсудить. А так я честно говоря не представляю себе.
№ 258 19-06-2006 18:29 | |
Ответ на »сообщение 255« (Jack Of Shadows)
___________________________
Так это и есть вопрос о внутреннем устройстве. :))
Нет, Вы не правы. Это был вопрос о том, почему Вы называете работу со списками в ФП работой "напрямую", а в ИП -- "не напрямую"?
Благодаря внутреннему устройству списка в ФЯ, ДЕКОМПОЗИЦИИ НЕТ.
Это в отличии от ИЯ где пытаясь работать со списком рекурсивно, неизбежно придется разбирать список на части.
Чтобы этого избежать, приходится работать в цикле.
Если физическая декомпозиция не происходит, это ещё не значит, что её нет. Для программиста всё выглядит именно так. Этот аспект я и имел в виду.
Опять же, относительно списков в ИЯ Вы заблуждаетесь. Рассмотрим элементарный односвязный список:
El1 -> El2 -> El3 -> El4 -> X
| |
head tail
Как видите tail указывает на оставшуюся часть списка, а head -- на первый элемент. Единственное, что, возможно, придётся сделать, это разорвать связь между El1 и El2. Хотя и это не потребуется, если делать всё в духе ФЯ. Ведь в ФЯ операция первый_элемент возвращает указатель не на элемент списка, а на содержательную часть. В ИЯ (по крайней мере строго типизированных) это будет выглядеть несколько более громоздко из-за контроля типов (тип элемента и тип содержимого элемента не тождественны). В ФЯ, в которых степень полиморфизма очень высока, да к тому же имеется механизм сопоставления с шаблоном всё будет выглядеть несколько более элегантно. Но никаких принципиальных отличий в этом отношении, на мой взгляд, нет.
На элемент можно, а вот на часть списка, начиная с какого то элемента как на новый список (подсписок) нельзя.
Вам придется создавать этот подсписок заново.
Именно это я и пытался обьяснить.
Как видите, я не согласен с Вами.
Я думаю что скоро в mainstream языках будет наблюдаться паритет ФЯ\ИЯ
Что позволит и вам и мне иметь то что нам хочется.
Это хорошо, что у людей есть выбор средств самовыражения. Очень хорошо. А если бы некоторые из них научились ими как следует пользоваться, было бы ещё лучше. Ну а если бы им ещё было, что выражать, так это вообще было бы прекрасно. Это я не про функциональных программистов, и не про императивных, а про программистов вообще, и просто -- про людей.
№ 257 19-06-2006 17:46 | |
Ответ на »сообщение 256« (hugi)
___________________________
вы хотите продемонстрировать, что я не знаком с устройством списка в ФП, и это меня задело.
Ни в коем случае. Мое обьяснение внутреннего устройства списков в ФЯ не имело никакой адресации.
И потом эту ветку читают люди, имеющие гораздо больше знания и опыта чем у меня. Понятно что не для них пишется. Кроме того любой энтузиаст ФП может раскрывать на этом форуме любую тему. Совсем не обязательно ждать моего графоманства :))
Я вам вот что скажу. Я буду несказанно рад, если кто нибудь кроме меня будет постить развернутое обьяснение принципов и техник ФП.
Я вот например хочу начать говорить о декларативном программировании в GUI, да все никак руки не доходят.
В частности о лисповой библиотеке cells
№ 256 19-06-2006 17:27 | |
Ответ на »сообщение 255« (Jack Of Shadows)
___________________________
Я вас прошу, без колкостей и перехода на личности. Я обижусь, отвечу, начнется перепалка, испортим хорошую дискуссию.
Как я читаю, итеративно или рекурсивно, а также какой у меня ник, это не ваше дело.
Прошу меня извинить. Я согласен с Вами. Я сознавал, что это выпад на грани, но тем не менее не удержался. Просто мне показалось, будто своим сообщением Вы хотите продемонстрировать, что я не знаком с устройством списка в ФП, и это меня задело. Пожалуй, я был неправ. Ещё раз приношу свои извенения. Впредь постараюсь вести дискуссию в духе fair play.
№ 255 19-06-2006 16:56 | |
Ответ на »сообщение 254« (hugi)
___________________________
Так это и есть вопрос о внутреннем устройстве. :))
Благодаря внутреннему устройству списка в ФЯ, ДЕКОМПОЗИЦИИ НЕТ.
Это в отличии от ИЯ где пытаясь работать со списком рекурсивно, неизбежно придется разбирать список на части.
Чтобы этого избежать, приходится работать в цикле.
А... В ИЯ нельзя вернуть указатель на элемент списка?
На элемент можно, а вот на часть списка, начиная с какого то элемента как на новый список (подсписок) нельзя.
Вам придется создавать этот подсписок заново.
Именно это я и пытался обьяснить.
Повторяю, я человек, и для меня это ничуть не легче, чем итеративный подход.
С детства не люблю рекурсию
Согласен, у разных людей разный подход, разные способы мышления.
Просто у императивщиков до сих пор всегда было преимущество.
Язык поддерживал способ мышления наиболее им близкий, и ставил палки в колеса тем, кому удобнее работать в функциональном стиле.
Однако сейчас ситуация выправляется (для меня конечно, не для вас)
Я думаю что скоро в mainstream языках будет наблюдаться паритет ФЯ\ИЯ
Что позволит и вам и мне иметь то что нам хочется.
Вам стоит задуматься над сменой псевдонима. На Нострадамус, например.
...
В следующий раз перечитайте, пожалуйста, вопрос раз эдак N, если у Вас есть какие-либо сомнения по поводу его смысла. Только итеративно, пожалуйста, а не рекурсивно.:)
Я вас прошу, без колкостей и перехода на личности. Я обижусь, отвечу, начнется перепалка, испортим хорошую дискуссию.
Как я читаю, итеративно или рекурсивно, а также какой у меня ник, это не ваше дело.
№ 254 19-06-2006 14:51 | |
Ответ на »сообщение 251« (Jack Of Shadows)
___________________________
Вам стоит задуматься над сменой псевдонима. На Нострадамус, например.
Хотя, может и не стоит. Ведь вопрос звучал так:
То есть перебрать элементы списка один за другим, не производя его декомпозицию с помощью операций первый_элемент, остальные_элементы, у Вас называется "работать не напрямую"?
А Вы интерпретировали его как вопрос о внутреннем устройстве списка в ФЯ, хотя вопрос был абсолютно конкретным. В следующий раз перечитайте, пожалуйста, вопрос раз эдак N, если у Вас есть какие-либо сомнения по поводу его смысла. Только итеративно, пожалуйста, а не рекурсивно.:)
P.S.
К тому же Вы не сообщили мне ничего нового, в ссылке, которую я приводил ниже, всё почти то же самое, только нагляднее и с картинками. Ещё раз настоятельно рекомендую ознакомиться желающим быстро войти в курс дела.
№ 253 19-06-2006 14:42 | |
Ответ на »сообщение 248« (Jack Of Shadows)
___________________________
ОК, но почему бы не работать с first и rest в ИЯ ? Разве нельзя вернуть список в которм убран первый элемент ?
Физически можно. Практически нереально.
<...>
А в ФЯ все гораздо легче, ведь rest не создает новый список, просто возвращает указатель на уже готовый.
А... В ИЯ нельзя вернуть указатель на элемент списка? И в ИЯ список не так реализован? Т.е. там элемент списка это не (указатель на содержимое элемента; ссылка на следующий элемент), причём в качестве содержимого также может выступать список?
Просто всё дело в том, что в ИЯ можно перебирать элементы "в лоб" с помощью циклов (с помощью итератора, например), а в ФЯ только с помощью декомпозиции: первый, остальные.
Это так естественно для человека, это так легко!!
Повторяю, я человек, и для меня это ничуть не легче, чем итеративный подход.
Циклы (for, while) превращают программирование в скучную и трудную работу.
Рекурсия (там где она практически возможна конечно, т.е. в ФЯ) возвращает вам обратно радость программирования.
С детства не люблю рекурсию. :) Применяю её только тогда, когда решение получается действительно более компактным и ясным, а такое случается далеко не всегда.
Попытки применять рекурсию в ИЯ утыкаются в физические особенности конструкции ИЯ, что делает применение рекурсии в лучшем случае трудным, в худшем (обработка больших списков) невозможным.
А вот здесь поподробней. Следуя презумпции невиновности, ИЯ ничуть не хуже ФЯ, пока не доказано обратное. Поэтому потрудитесь пожалуйста аргументировать свою точку зрения. А пока, меня Вы не убедили.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|