Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Базарная площадь
  
О разделе

Основная страница

Группы обсуждений


Тематический каталог обсуждений

Архив

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  07:25[Войти] | [Зарегистрироваться]
Обсуждение темы:
Функциональное программирование

Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.

Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.

Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.

 Jack Of Shadows

Количество сообщений на странице

Порядок сортировки сообщений
Новое сообщение вверху списка (сетевая хронология)
Первое сообщение вверху списка (обычная хронология)

Перейти на конкретную страницу по номеру


Всего в теме 5502 сообщения

Добавить свое сообщение

Отслеживать это обсуждение


Смотрите также обсуждения:
Средства разработки. Языки программирования.
  • Delphi 4 or Delphi 5
  • Что приобрести в качестве средства разработки?
  • Delphi6
  • Delphi vs PowerBuilder
  • Сравнение компиляторов
  • Вот и вышла Delphi 7... Вы рады?

  • <<<... | 3062—3053 | 3052—3043 | 3042—3033 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 246


    № 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


    <<<... | 3062—3053 | 3052—3043 | 3042—3033 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 246


    Добавить свое сообщение

    Отслеживать это обсуждение

    Дополнительная навигация:
    Количество сообщений на странице

    Порядок сортировки сообщений
    Новое сообщение вверху списка (сетевая хронология)
    Первое сообщение вверху списка (обычная хронология)

    Перейти на конкретную страницу по номеру
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования