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

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

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


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

Архив

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


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

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

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

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

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

 
   
С Л С

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

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

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

Квинтана

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

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

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

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

 
  
АРХИВЫ

 
 

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

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

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

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

 Jack Of Shadows

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

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

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


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

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

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


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

  • <<<... | 272—263 | 262—253 | 252—243 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 525


    № 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 языках будет наблюдаться паритет ФЯ\ИЯ
    Что позволит и вам и мне иметь то что нам хочется.

    Это хорошо, что у людей есть выбор средств самовыражения. Очень хорошо. А если бы некоторые из них научились ими как следует пользоваться, было бы ещё лучше. Ну а если бы им ещё было, что выражать, так это вообще было бы прекрасно. Это я не про функциональных программистов, и не про императивных, а про программистов вообще, и просто -- про людей.
     hugi


    № 257   19-06-2006 17:46 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 256« (hugi)
    ___________________________
    вы хотите продемонстрировать, что я не знаком с устройством списка в ФП, и это меня задело.
    Ни в коем случае. Мое обьяснение внутреннего устройства списков в ФЯ не имело никакой адресации.
    И потом эту ветку читают люди, имеющие гораздо больше знания и опыта чем у меня. Понятно что не для них пишется. Кроме того любой энтузиаст ФП может раскрывать на этом форуме любую тему. Совсем не обязательно ждать моего графоманства :))
    Я вам вот что скажу. Я буду несказанно рад, если кто нибудь кроме меня будет постить развернутое обьяснение принципов и техник ФП.
    Я вот например хочу начать говорить о декларативном программировании в GUI, да все никак руки не доходят.
    В частности о лисповой библиотеке cells


    № 256   19-06-2006 17:27 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 255« (Jack Of Shadows)
    ___________________________
    Я вас прошу, без колкостей и перехода на личности. Я обижусь, отвечу, начнется перепалка, испортим хорошую дискуссию.
    Как я читаю, итеративно или рекурсивно, а также какой у меня ник, это не ваше дело.

    Прошу меня извинить. Я согласен с Вами. Я сознавал, что это выпад на грани, но тем не менее не удержался. Просто мне показалось, будто своим сообщением Вы хотите продемонстрировать, что я не знаком с устройством списка в ФП, и это меня задело. Пожалуй, я был неправ. Ещё раз приношу свои извенения. Впредь постараюсь вести дискуссию в духе fair play.
     hugi


    № 255   19-06-2006 16:56 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 254« (hugi)
    ___________________________
    Так это и есть вопрос о внутреннем устройстве. :))
    Благодаря внутреннему устройству списка в ФЯ, ДЕКОМПОЗИЦИИ НЕТ.
    Это в отличии от ИЯ где пытаясь работать со списком рекурсивно, неизбежно придется разбирать список на части.
    Чтобы этого избежать, приходится работать в цикле.

    А... В ИЯ нельзя вернуть указатель на элемент списка?


    На элемент можно, а вот на часть списка, начиная с какого то элемента как на новый список (подсписок) нельзя.
    Вам придется создавать этот подсписок заново.
    Именно это я и пытался обьяснить.


    Повторяю, я человек, и для меня это ничуть не легче, чем итеративный подход.
    С детства не люблю рекурсию


    Согласен, у разных людей разный подход, разные способы мышления.
    Просто у императивщиков до сих пор всегда было преимущество.
    Язык поддерживал способ мышления наиболее им близкий, и ставил палки в колеса тем, кому удобнее работать в функциональном стиле.
    Однако сейчас ситуация выправляется (для меня конечно, не для вас)
    Я думаю что скоро в mainstream языках будет наблюдаться паритет ФЯ\ИЯ
    Что позволит и вам и мне иметь то что нам хочется.


    Вам стоит задуматься над сменой псевдонима. На Нострадамус, например.
    ...
    В следующий раз перечитайте, пожалуйста, вопрос раз эдак N, если у Вас есть какие-либо сомнения по поводу его смысла. Только итеративно, пожалуйста, а не рекурсивно.:)


    Я вас прошу, без колкостей и перехода на личности. Я обижусь, отвечу, начнется перепалка, испортим хорошую дискуссию.
    Как я читаю, итеративно или рекурсивно, а также какой у меня ник, это не ваше дело.


    № 254   19-06-2006 14:51 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 251« (Jack Of Shadows)
    ___________________________
    Вам стоит задуматься над сменой псевдонима. На Нострадамус, например.
    Хотя, может и не стоит. Ведь вопрос звучал так:
    То есть перебрать элементы списка один за другим, не производя его декомпозицию с помощью операций первый_элемент, остальные_элементы, у Вас называется "работать не напрямую"?
    А Вы интерпретировали его как вопрос о внутреннем устройстве списка в ФЯ, хотя вопрос был абсолютно конкретным. В следующий раз перечитайте, пожалуйста, вопрос раз эдак N, если у Вас есть какие-либо сомнения по поводу его смысла. Только итеративно, пожалуйста, а не рекурсивно.:)
    P.S.
    К тому же Вы не сообщили мне ничего нового, в ссылке, которую я приводил ниже, всё почти то же самое, только нагляднее и с картинками. Ещё раз настоятельно рекомендую ознакомиться желающим быстро войти в курс дела.
     hugi


    № 253   19-06-2006 14:42 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 248« (Jack Of Shadows)
    ___________________________
    ОК, но почему бы не работать с first и rest в ИЯ ? Разве нельзя вернуть список в которм убран первый элемент ?
    Физически можно. Практически нереально.
    <...>
    А в ФЯ все гораздо легче, ведь rest не создает новый список, просто возвращает указатель на уже готовый.

    А... В ИЯ нельзя вернуть указатель на элемент списка? И в ИЯ список не так реализован? Т.е. там элемент списка это не (указатель на содержимое элемента; ссылка на следующий элемент), причём в качестве содержимого также может выступать список?
    Просто всё дело в том, что в ИЯ можно перебирать элементы "в лоб" с помощью циклов (с помощью итератора, например), а в ФЯ только с помощью декомпозиции: первый, остальные.
    Это так естественно для человека, это так легко!!
    Повторяю, я человек, и для меня это ничуть не легче, чем итеративный подход.
    Циклы (for, while) превращают программирование в скучную и трудную работу.
    Рекурсия (там где она практически возможна конечно, т.е. в ФЯ) возвращает вам обратно радость программирования.

    С детства не люблю рекурсию. :) Применяю её только тогда, когда решение получается действительно более компактным и ясным, а такое случается далеко не всегда.
    Попытки применять рекурсию в ИЯ утыкаются в физические особенности конструкции ИЯ, что делает применение рекурсии в лучшем случае трудным, в худшем (обработка больших списков) невозможным.
    А вот здесь поподробней. Следуя презумпции невиновности, ИЯ ничуть не хуже ФЯ, пока не доказано обратное. Поэтому потрудитесь пожалуйста аргументировать свою точку зрения. А пока, меня Вы не убедили.
     hugi


    <<<... | 272—263 | 262—253 | 252—243 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 525


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

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

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

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

    Перейти на конкретную страницу по номеру
      
    Время на сайте: 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» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

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