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

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

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


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

Архив

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


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

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

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

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

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

 
   
С Л С

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

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

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

Квинтана

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

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

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

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

 
  
АРХИВЫ

 
 

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

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

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

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

 Jack Of Shadows

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

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

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


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

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

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


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

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


    № 3092   03-10-2007 16:25 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3088« (Илья Ермаков)
    ___________________________
    А вот РЕФАЛ мне глянулся
    В таком случае я вам могу посоветовать только одно: перелезайте на хаскель.
    Рефал заглох. Остался на обочине, как и оберон. Библиотек для него никто писать не будет, инструменты делать тоже. Так что шансы практического применения в деле весьма малы.
    А хаскель к рефалу гораздо ближе чем оберон :))
    К тому же без архаичного синтаксиса. Ну что это за x.1 e.2 чесслово :))


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


    № 3090   03-10-2007 16:14 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3088« (Илья Ермаков)
    ___________________________
    Спорить не буду. Конкретно на этом примере pattern matching в Рефале помощнее чем в хаскеле будет.
    Здаесь видно что он позволяет сопоставлять и последнему элементу списка. В хаскеле такое невозможно, по крайней мере без препроцессора.


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

    Ответ на »сообщение 3085« (Илья Ермаков)
    ___________________________
    То есть вот это вот

    IsPalindrome x = x = reverse x

    Это значит математическая заумь ? :))

    А Вы reverse разверните :-)


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

    Ответ на »сообщение 3085« (Илья Ермаков)
    Сильно отличается от рефала ?

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


    № 3087   03-10-2007 16:03 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3085« (Илья Ермаков)
    ___________________________
    Если вас интересует именно такая запись как в рефале, то на хаскеле можно сотворить нечто похожее, хотя и не такое же короткое:


    pal [] = True
    pal [x] = True
    pal (x:xs)
      | x == last xs = pal (init xs)
      | otherwise    = False



    Сильно отличается от рефала ?


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


    IsPalindrome {
        = true
    s.1 = true;
    s.1 e.2 s.1 = IsPalindrome e.2;
    e.1 = false;
    }


    У вас образец понятности кода незнакомому читателю.
    А вот это:


    IsPalindrome x = x = reverse x


    Это значит математическая заумь ? :))


    № 3085   03-10-2007 15:08 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3081« (Jack Of Shadows)
    ___________________________

    Ответ на »сообщение 3080« (Илья Ермаков)
    ___________________________
    А примеры "зауми" хаскеля по сравнению с Рефалом можно ? Желательно с кодом, но можно и так.

    Самый простой пример. Я сегодня готовил к учебному материалу, где во вводной части рассказывается про разные парадигмы программирования, иллюстрации примерами. При этом задача вводной части - только "галопом по Европам", дать кругозор и начальное любопытство, т.к. спецкурс по системному программированию, и углубляться сильно некогда...
    Так вот, пример для Рефала (я выбрал определение палиндрома) - его удалось отлично пояснить в полстранички текста:


    \example{Простейшая РЕФАЛ-программа}
    {
    Напишем на \app{РЕФАЛ}
    е программу для определения того, является или нет входная строка палиндромом. \concept{Палиндром} - это строка, которая читается одинаково слева направо и справа налево (например: \ttt{abccba}, \ttt{cecec}, \ttt{a}).

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

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

    В противном случае строка палиндромом не является.

    Можно отметить две особенности привед\"енной формулировки: во-первых, она основывается на \concept{сопоставлении строк с образцом}, во-вторых, оно является \concept{рекурсивным}: п. 3 определения палиндрома определяется через само определение палиндрома, примен\"енное к подстроке. Задачи, требующие применения сопоставления с образцом и рекурсии, легко отображаются на \app{РЕФАЛ}.

    Опишем функцию, сопоставляющую некоторой строке истину (\keyword{true}), если она является палиндромом, и ложь (\keyword{false}) в противном случае.

    \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;\\
    \}

    }
    }

    Эта программа состоит из четыр\"ех \concept{предложений}, раздел\"енных точкой с запятой. В каждом предложении в левой части от знака равенства, стоит \concept{образец}, с которым РЕФАЛ-машина пытается \concept{сопоставить} входную строку функции. Правая часть предложения определяют \concept{замену} для строки, в случае, если она совпала с образцом в левой части.

    В предложениях используются так называемые \concept{свободные переменные}. Со свободной переменной может быть сопоставлена любая часть строки, совпадающая с типом этой переменной. На месте s-переменной может быть любой одиночный символ, на месте e-переменной --- любое выражение. После точки записывается идентификатор свободной переменной (цифра или произвольный набор символов). Всем свободным переменным с одинаковым типом и идентификатором сопоставляется одно и то же значение.

    Таким образом, первое предложение программы заменяет значением \keyword{true} пустую строку. Второе предложение заменяет на \keyword{true} строку из одного символа. Третье предложение имеет образцом строку, символы в начале и конце которой совпадают, и заменяет е\"е на результат \concept{рекурсивного применения} IsPalindrome к средней части строки. РЕФАЛ-машина пытается применить предложения в том порядке, в котором они описаны. Таким образом, если не удалось сопоставить строку ни с одним из первых тр\"ех образцов, то она будет сопоставлена с четв\"ертым образцом, который даст замену на \keyword{false}.
    }



    Я хотел подобрать что-то подобное по выразительности из Haskell для "чисто ФП" (ибо РЕФАЛ я приводил как "марковский"). Посоветуете?

    Могу объяснить, по какому критерию меня оттолкнул Хаскелл. Я считаю, что продуманный язык программирования должен быть доступен для человека с опытом программирования и с хорошим высшим образованием для освоения на уровне "свободно читать" не более чем за один два-дня. Если же нет - то это верный призна бессмыссленной навороченности. Например, их двух равнозначных по возможностям языков - Ada и C++ - первая этому критерию полностью удовлетворяет. Второй - однозначно нет. Точно также и с ФП. Лисп - удовлетворяет. РЕФАЛ - удовлетворяет. А вот с Хаскеллом у меня так не вышло. Книгу Душкина почитал на досуге и не один вечер. Однако открывая программу на любой странице, постоянно обнаруживал, что свободно прочитать и понять код так и не могу. Не оставляет ощущение, что "понавернули ребята". :-)



    № 3084   03-10-2007 15:04 Ответить на это сообщение Ответить на это сообщение с цитированием
    Погуглил я на тему Сетла, наткнулся на статью Д.Я. Левина "СЕТЛ: РЕАЛИЗАЦИЯ И ПРИМЕНЕНИЕ ТЕОРЕТИКО-МНОЖЕСТВЕННОГО ЯЗЫКА ПРОГРАММИРОВАНИЯ" , там в самом начале приводится пример декларативности Сетла:

    Напечатать простые числа, меньшие N
    Print { n < N | not exist k , 1< k < n | div ( n , k )}


    Да, действительно, аналоги на Хаскелле выглядит куда более громоздко, непонятно и недекларативно, по сравнению с Сетлом...

    print [ x | x <- [2..n], not $ any (\k -> x `mod` k == 0) [2..x-1]]

    или

    print [ x | x <- [2..n], and [ x `mod` k /= 0 | k <- [2..x-1]]]


    Эх, даже не знаю, что и сказать... :о))


    № 3083   03-10-2007 14:52 Ответить на это сообщение Ответить на это сообщение с цитированием
    Ответ на »сообщение 3082« (Стэн)
    ___________________________

    Ответ на »сообщение 3079« (Илья Ермаков)
    ___________________________
    >>> Пишется, к примеру, для списка:
    >>> WHILE (item # NIL) & ~УсловиеПоискаОт(item) DO item := item.next END.

    Нет, не подходит...
    Это, что, для каждого случая где-то отдельно еще и функцию описывать?!:
    FUNCTION УсловиеПоискаОт(item: Type) : BOOLEAN;
    Да еще если на Обероне, который не поддерживает шаблоны... Для каждого Type свою функцию...

    Я написал условно. В большинстве случаев УсловиеПоиска будет формулироваться прямо по месту конкретным выражением.
    А для тех случаев, когда условие сложное, можно и определить локальную функцию (это не "где-то отдельно").
    Либо, на крайний случай, в Обероне используется цикл с явным выходом, но не смешанный с for или while, а "бесконечный":
    LOOP ... EXIT ... END.


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


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

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

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

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

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

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