Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 3052 03-10-2007 03:39 | |
Ответ на »сообщение 3046« (Geniepro)
___________________________
Так ведь это - основа основ: математика, логика...
Представьте, что оператор NOT вдруг начал выдавать то FALSE, то TRUE, то вапще UNDEFINED, независимо от входного параметра. Будет ли работать Ваша программа так, как Вам надо? :о))
В том-то вся и загвоздка. Математике нужна определённость. Причем определённость на каждом шаге. В каждой точке ветвления. И за такую определённость приходится платить.
Процесс мышления (равно и процесс исполнения "программы") можно рассматривать как совокупность (последовательность) преобразований (отображений) над сущностями с учётом отношений (с сохранением или без сохранения инвариантов). При этом, разумеется, существует вариативность. Но в каждой точке ветвления для отображений надо принимать конкретное решение. Причем сейчас, а не потом. И что характерно, как я понимаю, на этом фундаменте зиждется и ФП.
-- Ячейка памяти в ИП является read/write.
-- Ячейка памяти в ФП является write-once и read-many.
-- Ячейка памяти не может содержать несколько значений одновременно. Это можно имитировать, но такая вещь лежит вне магистрали работы, вне понятия функции в ФП, вне понятия ссылки в ИП.
Проблема кроется в том, что для принятия решения в той или иной задаче необходимо обладать информацией, которая может появиться только в ходе решения. Иными словами, откладывать конкретизацию как можно дальше, сохраняя вариативность. Когда будет достигнута точка принятия решения, может быть проведена конкретизация уже с учётом подобной накопленной информации. Механизм унификации термов и бэктрекинга в Прологе -- это небольшой штрих-пунктир возможного подхода.
Кстати, довольно интересно выглядит решение использования бэктрекинга в Форте. См. дипломную работу M.Л.Гaсaнeнкo (СПбГУ, 1992) "Новые структуры управления в языке Forth" -- http://www.forth.org.ru/~mlg/BacFORTH-88/BF-diplom.html
№ 3051 03-10-2007 03:29 | |
Ответ на »сообщение 3043« (Илья Ермаков)
___________________________
По моим наблюдениям нескольких лет, использование for с break вместо while - это просто бич новичков. В большинстве случаев их никто не переучивает, и этот кошмар приходит в промышленные программы...
Может, эти новички просто читают умные книжки? Например, "Рефакторинг" Мартина Фаулера. Такая мысль Вам в голову не приходила?
№ 3050 03-10-2007 03:27 | |
Ответ на »сообщение 3039« (Руслан Богатырев)
___________________________
>>> О, Вы не в курсе определения понятий "функция" и "отображение" в математике? :)
ОК. Тогда расскажите, пожалуйста, что это такое:
y(x) = x mod 5, где x = 1, 2, 3, ... (n >> 5).
И как так получается, что множество элементов X отображается в множество Y = {0, 1, 2, 3, 4}, где каждому y соответствует много элементов из X? Пример: y = 2 | x = 7, 12, 17...
Или это уже не математика?
№ 3049 03-10-2007 03:01 | |
Ответ на »сообщение 3048« (Geniepro)
___________________________
Ну правильно. Это код здесь столько раз постился, а императивщик все сказки про страшный и ужасный монад рассказывают :))
№ 3048 03-10-2007 03:00 | |
Ответ на »сообщение 3044« (Jack Of Shadows)
___________________________
Хотите пример последовательный операций в хаскеле при помощи страшных и непонятных монад ?
Пожалуйста:
Ой! Узнаю свою старенькую программку почти годовой давности, когда я вапще не знал Хаскелл. Сейчас знаю чуть получше, но всё равно до мэтров ещё далеко... ;о)
№ 3047 03-10-2007 02:51 | |
Ответ на »сообщение 3044« (Jack Of Shadows)
___________________________
Вот вы тут на новичков бочку катите, а я недавно говорил о катастрофическом положении с кодом разных программистов, с которым мне приходится работать. Императивных программистов разумеется. Мне до сих пор еще не приходилось видеть плохой код, написанный в функциональном стиле. Видимо это просто невозможно.
Так вот речь там идет не о новичках, а программистах с баальшим стажем и весьма презентабельным резюме.
Не далее как вчера, меня попросили сделать небольшое добавление в web приложении для одной компании.
Открыл я файл (asp), нашел место где нужно было сделать изменение где то на 300-й строчке, и в изумлении уставился на следующий кусок...кхм..кода вобщем:
<%dim fso, directorypath, filetype
set fso = server.CreateObject("Scripting.FilesystemObject")
dim fileexists, RootFolder
RootFolder = UploadPath2 & "Vendors\VENDORS\Contractor_Agreements\"
fileexists = false
' .doc
directorypath = RootFolder & firstname & " " & lastname & " Contract.doc"
fileexists = fso.FileExists(DirectoryPath)
filetype = " Contract.doc"
if fileexists = false then
' .rtf
directorypath = RootFolder & firstname & " " & lastname & " Contract.rtf"
fileexists = fso.FileExists(DirectoryPath)
filetype = " Contract.rtf"
end if
if fileexists = false then
' .pdf
directorypath = RootFolder & firstname & " " & lastname & " Contract.pdf"
fileexists = fso.FileExists(DirectoryPath)
filetype = " Contract.pdf"
end if
if fileexists = false then
' .tif
directorypath = RootFolder & firstname & " " & lastname & " Contract.tif"
fileexists = fso.FileExists(DirectoryPath)
filetype = " Contract.tif"
end if
if fileexists = false then
' .htm
directorypath = RootFolder & firstname & " " & lastname & " Contract.htm"
fileexists = fso.FileExists(DirectoryPath)
filetype = " Contract.htm"
end if
if fileexists = false then
' .html
directorypath = RootFolder & firstname & " " & lastname & " Contract.html"
fileexists = fso.FileExists(DirectoryPath)
filetype = " Contract.html"
end if
set fso = nothing
У меня глаза на лоб полезли, однако делать нечего, пришлось мне это переписать в небольшой цикл в 4 строчки и вывести в отдельную функцию.
Запускаю, получаю ошибку неопределенной переменной где то на строчке 1250 (да да такая вот простыня, обычное дело вобщем.)
Лезу туда, батюшки! Тот же самый кусок кода, один в один с микроскопическим изменением, и использует естественно те же переменные.
Вот так вот, мало того этот програмист в кавычках в цикл завернуть не смог, так он даже в функцию вывести для повторного использования не догадался. А может просто лень было. Может просто удобнее copy-paste.
Может после школы они у вас в большинстве вот так деградируют ?
№ 3046 03-10-2007 02:48 | |
Ответ на »сообщение 3036« (Руслан Богатырев)
___________________________
Увы, математическая функция требует однозначности: нельзя одному и тому же элементу множества X поставить в соответствие несколько элементов множества Y. Недопустима вариативность.
Так ведь это - основа основ: математика, логика...
Представьте, что оператор NOT вдруг начал выдавать то FALSE, то TRUE, то вапще UNDEFINED, независимо от входного параметра. Будет ли работать Ваша программа так, как Вам надо? :о))
№ 3045 03-10-2007 02:38 | |
Ответ на »сообщение 3043« (Илья Ермаков)
___________________________
В некотором роде это педагогическое. :-) По моим наблюдениям нескольких лет, использование for с break вместо while - это просто бич новичков. В большинстве случаев их никто не переучивает, и этот кошмар приходит в промышленные программы...
Конечо кошмар, пудрите новичкам мозги циклами, потом жалуетесь. Начали бы с функций, показали бы стандартные функции циклической обработки данных (map, fold, filter). Заставили бы написать пару тысяч строк безо всяких операторов цикла, и потом никакой for им страшен не будет :))
№ 3044 03-10-2007 02:19 | |
Ответ на »сообщение 3042« (Илья Ермаков)
___________________________
Илья, последовательность в рецепте является частью задачи. Она явно описана, и потому точно также явно и будет задана в программе, даже в функциональной программе.
Хотите пример последовательный операций в хаскеле при помощи страшных и непонятных монад ?
Пожалуйста:
main = do fromHandle <- openFile' "E:\\fiblist.out" ReadMode
contents <- hGetContents fromHandle
putStr "Number of commas = "
print (calcCommas contents)
hClose fromHandle
Ну как ? испугались страшной монады ? Смльно отличается от того как вы это записали бы в обероне ?
Единственное видимое отличие знак <- вместо :=
Вот и все, вылезайте из под одеяла :))
№ 3043 03-10-2007 02:16 | |
Ответ на »сообщение 3037« (Jack Of Shadows)
___________________________
Ответ на »сообщение 3035« (Илья Ермаков)
___________________________
Не ну серьезно что такого творческого вы увидели в жонглировании счетчиками циклов ? :))
В некотором роде это педагогическое. :-) По моим наблюдениям нескольких лет, использование for с break вместо while - это просто бич новичков. В большинстве случаев их никто не переучивает, и этот кошмар приходит в промышленные программы...
Подробнее обсуждали здесь - http://forum.oberoncore.ru/viewtopic.php?p=5024#p5024
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|