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

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

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


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

Архив

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


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

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

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

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

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

 
   
С Л С

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

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

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

Квинтана

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

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

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

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

 
  
АРХИВЫ

 
 

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

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

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

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

 Jack Of Shadows

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

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

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


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

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

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


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

  • <<<... | 232—223 | 222—213 | 212—203 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 529


    № 222   18-06-2006 04:13 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 221« (Max Belugin)
    ___________________________
    Однако и в C++, матрицу, определённую как массив массивов, легко зеркально обратить двумя вызовами стандартного "алгоритма" (функции) reverse. Хотя это и не Лисп.
    Тем не менее, вложенные циклы и там никуда не делись: просто они упрятаны внутрь reverse.
    Т.о. речь в данном случае идёт лишь о богатстве стандартной библиотеке, но не о языке как таковом.


    № 221   18-06-2006 03:45 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 219« (Гость)
    ___________________________
    дело в том что в приведенном примере код очень легко собирается из библиотечных функция для работы со списками и функциями: т.е. транспонирования матрицы как такового нет в библиотеке, но оно очень легко получается комбинацией функций.

    Правда тут дело скорее не в функциональной природе языка, а в традициях работать с функциями как со значениями. И наличии можных и простых средств для этого в библиотеке (типа map).



    № 220   18-06-2006 03:40 Ответить на это сообщение Ответить на это сообщение с цитированием
    А вот интересно как там с базами данных. С одной стороны в ФП каждое состояние - это отдельный объект, с другой стороны, есть identity - т.е. надо знаять что два состояния относятся к одному и тому же объекту.

    Например как записывается функционально транзакция типа "перемещение суммы между счетами".

    Еще интересно, как сделать так, чтобы то что мне нравится из ОО и из ФП было в одном месте - то есть чтобьы структурно было ОО (классы, наследование, абстракция свойств), а алгоритмически - ФП: вместо императивных методов-функии (помнится, Трурль как-то говорил, что чем больше ОО, тем меньше ФП - не мог бы он пояснить).

    Опять-таки непонятно что делать с identity.

    Вот допусим примерный ОО код (условное подобие C# 3.0).


    class AccountingSystem
    {
        Collection<Account> accounts;
        void transfer(){
          accounts.where(a => a.Number=='70').Value+=10;
          accounts.where(a => a.Number=='50').Value-=10;
        }

    }



    Как переписать его функционально?

    Мне хочется:
      *чтобы результат был простым
      *чтобы если вместо Number потавить слово TestZY то оно б не скомпилировалось со внятным сообщением об ошибке
      *чтобы Number и Value были бы свойстами - т.е. я в любой момент мог бы подменить их реализацию без изменениям использующего их кода


    № 219   18-06-2006 03:03 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 218« (Jack Of Shadows)
    ___________________________
    При всём уважении к Лиспу и к Вам, Вагиф, не могу не заметить, что точно так же и в любом ООПном языке можно заранее описАть класс матрицы, а потом привести изящный пример решения этой задачи:

    A.Transp();

    Или ещё короче:
    ~A;

    В то же время Лисп-для-виндоус, очевидно, на нижнем уровне реализован на Сях (т.е. WinApi). Соответственно, тот же самый цикл с переменными просто упрятал в глубь лисповой библиотеки.
    Т.е. и в случае Лиспа, и в случае заранее созданной библиотеки классов, изящность решения получается лишь за счёт того, что цикл уже написан кем-нибудь заранее.

    С другой стороны, сама постановка задачи мне кажется не вполне грамотной.
    Ставить так вопрос - всё равно, что противопоставлять процедурное программирование не только функциональному, но и объектному.
    У циклов - свой уровень абстракции, у классов свой - и незачем их перемешивать.


    № 218   17-06-2006 12:46 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 215« (Q. Werty)
    ___________________________
    Этот простой пример скажет мне намного больше, чем все рассуждения о мощи и невиданных способностях к написанию программ на ФЯ. Я сразу смогу оценить и "близость к человеку" и все остальное. В общем, если не трудно, "текст в студию" :)

    Господин torvic привел прекрасный пример, который ярко иллюстрирует разницу в императивном и функциональном мышлении.
    Как видите в отличие от примера Qwerty не используется никаких промежуточных переменных, никаких действий, никакого жонглирования ячейками памяти.

    Код читается и понимается в практически моментально.
    Это в отличие от императивного кода где надо продраться сквозь 2 цикла, и три перестановки, чтобы понять зачем все эти передвижения нужны.

    А ведь это тривиальнейший пример.

    А теперь господин Qwerty представьте себе код хотя бы в сотню строк.


    Не надо было пиво пить с утра :))))


    А вот это неправда. Зря вы на себя бочку катите. Даже такая тривиальныя задача как транспонирование матрицы становится легко запутывающей головоломкой, если пытаться ее решить императивным методом.
    "Осокобанивание" задачи дает себя знать.
    Вы запутались господин Qwerty. Причем запутались не в решении задачи транспонирования, а в решении сопутствующей ей при императивном подходе задачи жонглирования переменными.

    Вот вам доказательство на вашем же собственном опыте, что вы теряете, работая таким образом, и что могли бы получить, открыв для себя мир функционального программирования.




    № 217   17-06-2006 10:05 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 216« (Q. Werty)
    ___________________________

    (define (transp matrix)
    (apply map list matrix))

    > (transp '((0 1 2)
                (3 4 5)
                (A B C)
                (D E F))
      )
    ((0 3 A D) (1 4 B E) (2 5 C F))


    P.S. Это так из-за любви к искусству, учить этому в средней школе, имхо, пустая трата времени и нервов.


    № 216   17-06-2006 05:43 Ответить на это сообщение Ответить на это сообщение с цитированием
    Oops!!!
    Не надо было пиво пить с утра :))))

    Алгоритм, конечно, надо читать так:

    { транспонирование матрицы A [1..N,1..N] }
    for i:=1 to N-1 do
    for j:=i+1 to N do
    begin
      r:=A[i,j];
      A[i,j]:=A[j,i];
      A[j,i]:=r
    end;

    Но суть вопроса от этого не меняется - как решение задачи будет выглядеть на языке лисп?



    № 215   17-06-2006 00:50 Ответить на это сообщение Ответить на это сообщение с цитированием
    >>>Так вы и еще и нос воротите. :)))

    1) Не "нос ворочу", а пытаюсь разобраться в предмете.
    Не надо меня подозревать, что я не умею искать в инете или отличаюсь повышенной ленью :))) Просто человеку, который давно знаком с темой и понял, что именно мне надо, намного легче посоветовать мне сразу пару наиболее подходящих ссылок, чем ждать, когда я сам буду перебирать те 20 или 40, которые мне выдаст гугл. (Кстати, спасибо!).

    2) Моя критика связана не с тем, что я "человек привычки". Просто я уже не в том возрасте, когда на меня действует "агитпроп". К Оберону я шел 3 года (до этого: VB, TP, C++, Delphi). А Вы хотите чтобы я влюбился в ЛИСП после пары-тройки восторженных постов :))). Так не бывает. Jack прав. Пока я не напишу свою собственную задачу на лиспе и не увижу, что это получается легче и лучше, чем на императивном языке, то в моем собственном взгляде на лисп ничего не сдвинется.

    3) А теперь вопрос :))
    На императивном языке алгоритм транспонирования матрицы A[1..N,1..N]будет выглядеть примерно так (для простоты беру классический паскаль, суть дела все равно не меняется):
    { транспонирование матрицы A NxN по главной диагонали }
    for i:=1 to N-1 do
    for j:=1 to N-i do
    begin
      r:=A[i,j];
      A[i,j]:=A[j,i];
      A[j,i]:=r
    end;

    Человеку с "императивным сознанием" и представляющим себе, что такое 2-мерный массив здесь, как говорится, все ясно.

    Как будет выглядеть решение этой же задачи на лиспе?
    Этот простой пример скажет мне намного больше, чем все рассуждения о мощи и невиданных способностях к написанию программ на ФЯ. Я сразу смогу оценить и "близость к человеку" и все остальное. В общем, если не трудно, "текст в студию" :)








    № 214   17-06-2006 00:22 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 206« (Jack Of Shadows)
    ___________________________

    Самый естественный для человека формат данных, не запись (структура), не обьект, СПИСОК! И его нет ни в одном императивном языке!
    Как любят говорить математики, "Есть три вида лжи: ложь, наглая ложь и математическая статистика".
    К какому виду отнесем этот случай?


    № 213   16-06-2006 14:23 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 212« (Jack Of Shadows)
    ___________________________
    Опечатка. lispworks.com


    <<<... | 232—223 | 222—213 | 212—203 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 529


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

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

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

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

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

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