Функциональное программирование |
Функциональное программирование всегда привлекало меня в противопоставлении к императивному.
Я очень часто обсуждаю различные аспекты функционального программирования на различных ветках на Базарной площади.
Но хотелось бы собрать всех заинтересованный этой темой в одной ветке.
Я думаю что настало время открыть такую тему. И вот почему.
Исторически функциональное программирование появилось практически вместе с императивным.
Вторым языком после фортрана был лисп.
Но увы, функциональное программирование надолго было уделом исследовательских институтов или специализированных приложений (Искусственный Интеллект)
Конечно не надо считать весь мир дураками из за того что развитие пошло по пути языков Алгол семейства.
Для этого были вполне обьективные причины. Функциональные языки слишком близки к человеку и слишком далеки от машины.
Они сьедают в десятки раз больше рессурсов чем императивные языки.
Вспомните претензии, предявляемые к java - первому императивному языку с виртуальной машиной и сборщиком мусора, толкаемому большими корпорациями в mainstream.
Жутко тормозит, и жрет всю память какая есть. А ведь функциональные языки (далее ФЯ) все без иключения имеют сборщик мусора, виртуальную машину.
Многие из них (семейство лисп) еще и динамические, что только усугубляет положение.
Вполне естественно что появившись более полусотни лет назад они надолго опередилли свое время.
Для широкого распространения ФЯ нужны гигабайты дешевой памяти и гигагерцы дешевых процессоров.
Прошло более 50 лет, прежде чем такие требования к железу стали реальностью.
Это время наступило. СЕЙЧАС.
Добро пожаловать в новую эру программирования.
Jack Of Shadows
Всего в теме 5502 сообщения
Добавить свое сообщение
Отслеживать это обсуждение
- Средства разработки. Языки программирования.
- Delphi 4 or Delphi 5
- Что приобрести в качестве средства разработки?
- Delphi6
- Delphi vs PowerBuilder
- Сравнение компиляторов
- Вот и вышла Delphi 7... Вы рады?
№ 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
У вас образец понятности кода незнакомому читателю.
А вот это:
IsPalindrome x = x = reverse x
Это значит математическая заумь ? :))
№ 3085 03-10-2007 15:08 | |
Ответ на »сообщение 3081« (Jack Of Shadows)
___________________________
Ответ на »сообщение 3080« (Илья Ермаков)
___________________________
А примеры "зауми" хаскеля по сравнению с Рефалом можно ? Желательно с кодом, но можно и так.
Самый простой пример. Я сегодня готовил к учебному материалу, где во вводной части рассказывается про разные парадигмы программирования, иллюстрации примерами. При этом задача вводной части - только "галопом по Европам", дать кругозор и начальное любопытство, т.к. спецкурс по системному программированию, и углубляться сильно некогда...
Так вот, пример для Рефала (я выбрал определение палиндрома) - его удалось отлично пояснить в полстранички текста:
\example
е программу для определения того, является или нет входная строка палиндромом. \concept - это строка, которая читается одинаково слева направо и справа налево (например: \ttt, \ttt, \ttt).
По определению, палиндромом является:
\begin
\item пустая строка;
\item строка из одного символа;
\item строка, у которой совпадает первый и последний символ, и подстрока, полученная удалением первого и последнего символа, является палиндромом.
\end
В противном случае строка палиндромом не является.
Можно отметить две особенности привед\"енной формулировки: во-первых, она основывается на \concept, во-вторых, оно является \concept: п. 3 определения палиндрома определяется через само определение палиндрома, примен\"енное к подстроке. Задачи, требующие применения сопоставления с образцом и рекурсии, легко отображаются на \app.
Опишем функцию, сопоставляющую некоторой строке истину (\keyword), если она является палиндромом, и ложь (\keyword) в противном случае.
\hspace\parbox
}
}
Эта программа состоит из четыр\"ех \concept, раздел\"енных точкой с запятой. В каждом предложении в левой части от знака равенства, стоит \concept, с которым РЕФАЛ-машина пытается \concept входную строку функции. Правая часть предложения определяют \concept для строки, в случае, если она совпала с образцом в левой части.
В предложениях используются так называемые \concept. Со свободной переменной может быть сопоставлена любая часть строки, совпадающая с типом этой переменной. На месте s-переменной может быть любой одиночный символ, на месте e-переменной --- любое выражение. После точки записывается идентификатор свободной переменной (цифра или произвольный набор символов). Всем свободным переменным с одинаковым типом и идентификатором сопоставляется одно и то же значение.
Таким образом, первое предложение программы заменяет значением \keyword пустую строку. Второе предложение заменяет на \keyword строку из одного символа. Третье предложение имеет образцом строку, символы в начале и конце которой совпадают, и заменяет е\"е на результат \concept IsPalindrome к средней части строки. РЕФАЛ-машина пытается применить предложения в том порядке, в котором они описаны. Таким образом, если не удалось сопоставить строку ни с одним из первых тр\"ех образцов, то она будет сопоставлена с четв\"ертым образцом, который даст замену на \keyword.
}
Я хотел подобрать что-то подобное по выразительности из Haskell для "чисто ФП" (ибо РЕФАЛ я приводил как "марковский"). Посоветуете?
Могу объяснить, по какому критерию меня оттолкнул Хаскелл. Я считаю, что продуманный язык программирования должен быть доступен для человека с опытом программирования и с хорошим высшим образованием для освоения на уровне "свободно читать" не более чем за один два-дня. Если же нет - то это верный призна бессмыссленной навороченности. Например, их двух равнозначных по возможностям языков - Ada и C++ - первая этому критерию полностью удовлетворяет. Второй - однозначно нет. Точно также и с ФП. Лисп - удовлетворяет. РЕФАЛ - удовлетворяет. А вот с Хаскеллом у меня так не вышло. Книгу Душкина почитал на досуге и не один вечер. Однако открывая программу на любой странице, постоянно обнаруживал, что свободно прочитать и понять код так и не могу. Не оставляет ощущение, что "понавернули ребята". :-)
№ 3084 03-10-2007 15:04 | |
Погуглил я на тему Сетла, наткнулся на статью Д.Я. Левина "СЕТЛ: РЕАЛИЗАЦИЯ И ПРИМЕНЕНИЕ ТЕОРЕТИКО-МНОЖЕСТВЕННОГО ЯЗЫКА ПРОГРАММИРОВАНИЯ" , там в самом начале приводится пример декларативности Сетла: Напечатать простые числа, меньшие N
Print
Да, действительно, аналоги на Хаскелле выглядит куда более громоздко, непонятно и недекларативно, по сравнению с Сетлом... 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.
Добавить свое сообщение
Отслеживать это обсуждение
Дополнительная навигация: |
|