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

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

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


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

Архив

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


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

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

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

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

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

 
   
С Л С

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

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

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

Квинтана

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

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

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

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

 
  
АРХИВЫ

 
 

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

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

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

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

 Jack Of Shadows

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

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

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


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

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

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


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

  • <<<... | 3112—3103 | 3102—3093 | 3092—3083 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 241


    № 3102   03-10-2007 17:52 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3100« (Jack Of Shadows)
    ___________________________
    Не, ну всё. я передаю Вам вахту на сегодня )))


    № 3101   03-10-2007 17:51 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3097« (Илья Ермаков)
    ___________________________

    А вот теперь давайте прикинем... Сколько понятий мне нужно объяснить человеку, незнакомому с Хаскелем, чтобы ему было понятно всё от скобки до скобки в этом примере?
    В рефале это функция, сопоставление с образцом по предложениям, свободные переменные и рекурсия.
    Здесь же ещё и кортежи, и разжёвывание загадочных для непосвящённого вариаций со скобками [], [_], (x:xs), и наконец - last и init...

    Не знаю, где Вы там кортежи углядели, но да ладно, у страха глаза велики...

    palindrom []  = True
    palindrom [_] = True
    palindrom (x:xs)  = x == last xs && palindrom (init xs)

    Давайте по шагам:

    palindrom []  = True

    и

    palindrom [_] = True


    [] и [_] обозначают соответственно пустой список и список с одним элементом.
    palindrom - название определяемой функции. True - логическое значение "Истина" - это очевидно, не так ли?
    Функция palindrom здесь описывается в декларативном стиле - то есть для каждого варианта аргумента декларируется свой вариант результата. Впрочем, в данной функции первые два варианта аргументов приводят к одному и тому же результату - истина, как и было указано в Вашей спецификации...

    palindrom (x:xs)  = x == last xs && palindrom (init xs)


    (x:xs) - это и есть сопоставление с образцом, но не по предложениям (кстати, что это?), а по списку - под x обозначается первый элемент списка, под xs - "хвост" списка. то есть остальные элементы.
    == - это просто операция сравнения на равенство, а & - логическая операция "И" - это ведь несложно запомнить? Ну и, наконец, две стандартные функции - last (последний элемент списка) и init (начало списка без последнего элемента) - это тоже нужно просто запомнить.

    Так и что же тут чудовищно сложного и непонятного, а потому и не запоминаемого? Ваш код на Рефале немногим лучше регэкспов Перла...

    Вот почему от идеи всунуть в лекцию пример на Хаскелле я отказался очень быстро. Чистое лямбда-исчисление за три минуты тоже не покажешь. Вот и остался РЕФАЛ, который показывает, что ещё в мире существует акромя императива :-)

    Знаете, мне нравится такое выражение: "Залезть на дерево - не значит сделать первый шаг к Луне..." :о)

    Ни одного ключевого слова, ни begin, ни end, одни закорючки ненашенские :-)

    Ой, Вы знаете, у меня та же самая проблема - я совершенно не понимаю по китайски! Какие-то крючёчки, палочки, "одни закорючки ненашенские :-)" (с) :о))

    Кстати, интересно, а присутствует ли у Хаскелла типичный, например, для С++ эффект, когда после долгой паузы в работе с языком (полгода-год) начинаешь местами путаться в коде и долго спотыкаешься о подзабытые детали?

    Так эта... На любом языке можно писать по-фортрановски...


    № 3100   03-10-2007 17:47 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3097« (Илья Ермаков)
    ___________________________
    Здесь же ещё и кортежи, и разжёвывание загадочных для непосвящённого вариаций со скобками [], [_], (x:xs), и наконец - last и init...
    Ну давайте сравним с Рефалом.

    Кортежи - и там и там, придется либо обьяснять либо надеяться на "интуитивность"

    [] в Хаскеле это пустой список. В Рефале тот же пустой список записан как... как ничего вообще. Смотрите первую строчку налево от = true. Попробуйте обьяснить новичку чего это там = true. Гы :))

    [_] в Хаскеле это список с одним элементом. Можно также записать и как [x]
    В Рефале тоже самое записано как s.1 - Попробуйте обьяснить новичку, да еще пришедшему с ООП языков с их точечной нотацией что такое s.1 :))

    x:xs - в хаскеле это первый:остальные. В Рефале записывается ТОЧНО ТАКЖЕ x.1 xs.1 - И В том и в другом случае придется обьяснять. Только в Рефале еще и эти странные .1 тоже придется обьяснять. 

    last и init это функции. Обычные функции Илья.
    Last - последний элемент списка. Init - Список без последнего элемента.

    Ну что Илья ? Много у вас ушло времени на разжевывание этого текста ? Учитывая что практически все тоже самое вам пришлось бы обьяснять и для Рефала я вообще выигрыша не вижу.


    № 3099   03-10-2007 17:31 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3096« (Jack Of Shadows)
    ___________________________

    Да, (x:xs) - стандартная идиома для Хаскелла...
    Вообще, у Хаскелловских списков есть пара недостатков - то, что набор операций над ними не выделен в стандартные классы типов наподобие ListLike/Foldable/... На RSDN'е как-то был флейм "ФП и аьстракция списка", если бы в Хаскелле более полно использовали классы типов, в том числе и для стандартных списков, имхо, было бы гораздо удобнее...
    Ещё недостаток - нет конструктора типа наподобие (:), но цепляющий новый элемент не к началу списка, а к концу его, соответственно паттерн матчинг можно было бы проводить более удобно. Например, если бы этот конструктор обозначался бы ну хотя бы так: (%), то тот же палиндром можно было бы сделать так:

    palindrom [ ]      = True
    palindrom [_]      = True
    palindrom (x:xs%s) = x == s & palindrom xs

    Но двунаправленные списки (которые были,Ю например, в ФЯ Hope) вероятно менее эффективны, чм обычные односвязные... В-общем, Хаскелл далёк от совершенства - авторы не рискнули пойти дальше...


    № 3098   03-10-2007 17:26 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3095« (Geniepro)
    ___________________________

    Ответ на »сообщение 3088« (Илья Ермаков)
    ___________________________
    Не, ну я поражаюсь! 8-о В Хаскелле самый простой, копактный и элегантный синтаксис, когда-либо мною виденный. Рефал - просто брейнфак какой-то по сравнению с Хаскеллем... Я пытался изучить Рефал - ниасилил! Ну не то это!
    Хотя, понимаю, для любителей Оберона, у которого ярко выраженный тяжеловесный немецкий акцент в синтаксисе, то конечно... Чем громоздче, тем лучше... Ну, на вкус и цвет...

    ОснОвательная прОстОта Оберона лучше изощрённых изяществ :-)
    С "простым, компактным и элегантным" в конкретной программе без поллитры не продерёшься... :-) Ни одного ключевого слова, ни begin, ни end, одни закорючки ненашенские :-) Кстати, интересно, а присутствует ли у Хаскелла типичный, например, для С++ эффект, когда после долгой паузы в работе с языком (полгода-год) начинаешь местами путаться в коде и долго спотыкаешься о подзабытые детали?


    № 3097   03-10-2007 17:22 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3096« (Jack Of Shadows)
    ___________________________

    Ответ на »сообщение 3094« (Geniepro)
    ___________________________
    Еще чуть чуть короче:

    palindrom []  = True
    palindrom [_] = True
    palindrom (x:xs)  = x == last xs && palindrom (init xs)

    А вот теперь давайте прикинем... Сколько понятий мне нужно объяснить человеку, незнакомому с Хаскелем, чтобы ему было понятно всё от скобки до скобки в этом примере?
    В рефале это функция, сопоставление с образцом по предложениям, свободные переменные и рекурсия.
    Здесь же ещё и кортежи, и разжёвывание загадочных для непосвящённого вариаций со скобками [], [_], (x:xs), и наконец - last и init... Вот почему от идеи всунуть в лекцию пример на Хаскелле я отказался очень быстро. Чистое лямбда-исчисление за три минуты тоже не покажешь. Вот и остался РЕФАЛ, который показывает, что ещё в мире существует акромя императива :-)


    № 3096   03-10-2007 17:02 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3094« (Geniepro)
    ___________________________
    Еще чуть чуть короче:


    palindrom []  = True
    palindrom [_] = True
    palindrom (x:xs)  = x == last xs && palindrom (init xs)



    № 3095   03-10-2007 16:44 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3088« (Илья Ермаков)
    ___________________________

    Ну, капризный я, капризный :-) Лишний "синтаксический мусор", сбивающий с толку. И вообще, хаскелл значками перегружен, на мой взгляд.
    А вот РЕФАЛ мне глянулся :-) К тому же, по ощущениям, он должен быть легко интеграбелен - например, для обработки объектов других языков.

    Не, ну я поражаюсь! 8-о В Хаскелле самый простой, копактный и элегантный синтаксис, когда-либо мною виденный. Рефал - просто брейнфак какой-то по сравнению с Хаскеллем... Я пытался изучить Рефал - ниасилил! Ну не то это!
    Хотя, понимаю, для любителей Оберона, у которого ярко выраженный тяжеловесный немецкий акцент в синтаксисе, то конечно... Чем громоздче, тем лучше... Ну, на вкус и цвет...


    № 3094   03-10-2007 16:35 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3085« (Илья Ермаков)
    ___________________________

    Книгу Душкина почитал на досуге и не один вечер.

    Пожалуй, зря Вы начали с книги Душкина... По отзывам, она не подходит для начинающих в Хаскелле...

    Я считаю, что продуманный язык программирования должен быть доступен для человека с опытом программирования и с хорошим высшим образованием для освоения на уровне "свободно читать" не более чем за один два-дня. Если же нет - то это верный призна бессмыссленной навороченности. Например, их двух равнозначных по возможностям языков - Ada и C++ - первая этому критерию полностью удовлетворяет. Второй - однозначно нет.

    Ну что ж, это хороший признак для Хаскелла - мэйнстрим любит бессмысленные навороты типа foreach, так что Хаскелл там точно приживётся, в отличии от Рефала! :о)))

    Так вот, пример для Рефала (я выбрал определение палиндрома) - его удалось отлично пояснить в полстранички текста:

    Какой ужос! А нельзя ли из ТеХа перевести в plain text?

    По определению, палиндромом является:

    \begin{enumerate}
    \item пустая строка;
    \item строка из одного символа;
    \item строка, у которой совпадает первый и последний символ, и подстрока, полученная удалением первого и последнего символа, является палиндромом.
    \end{enumerate}

    на Хаскелле так и будет:

    palindrom []  = True
    palindrom [_] = True
    palindrom xs  = head xs == last xs && palindrom (tail (init xs))

    Тест:


    main = do
        print $ palindrom ""                      -- True
        print $ palindrom "?"                    -- True
        print $ palindrom "abrakadabra"          -- False
        print $ palindrom "POTOP"                -- True
        print $ palindrom "arozaupalanalapuazora" -- True


    Я не разобрал там Ваш код на Рефале, но он меня напугал... :о)

    \hspace{2cm}\parbox{11cm}{
    \code{\\
    IsPalindrome \{\\
    \tab = true;\\
    \tab s.1 = true;\\
    \tab s.1 e.2 s.1 = <IsPalindrome e.2>;\\
    \tab e.1 = false;\\
    \}

    }
    }


    Эх, Вагиф опередил с IsPalindrome x = x = reverse x :о))


    № 3093   03-10-2007 16:34 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3091« (Jack Of Shadows)
    ___________________________

    Ответ на »сообщение 3088« (Илья Ермаков)
    ___________________________
    Зато хаскель выигрывает обратно на полиморфизме. Хаскелевская функция работает с любыми списками, в то время как Рефал только со строчками :))

    А если мы истрактуем строчку не как строчку символов, а как кортеж произвольных объектов нижележащего языка программирования? Того же Оберона. Доступных через метамеханизмы рантайма. Получим введение декларативного скрипта верхнего уровня. Способного ещё и выполнять функции спецификации на взаимодействие, как грамматики в Зонноне и Композите...

    Це ж какая лепота выходит...


    <<<... | 3112—3103 | 3102—3093 | 3092—3083 | ...>>>
    Всего сообщений в теме: 5502; страниц: 551; текущая страница: 241


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

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

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

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

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

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