функциональные языки (Что за звери?)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
brazhe
Сообщения: 89
Контактная информация:

функциональные языки

Сообщение brazhe »

Всем привет :)
кто бы смог доходчиво объяснить что за звери такие функциональные языки программирования, в чём фишка, и какие они бывают. Я не программист, но мне просто интересно и хотелось бы увидеть ваши комментарии.
Спасибо!
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: функциональные языки

Сообщение t.t »

Первый язык функционального прораммирования -- это Lisp. По-моему, все остальные пошли уже от него. Сейчас в памяти освежу, чтоб чего-то не того не сказать, -- отвечу подробнее.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
bogus
Сообщения: 160

Re: функциональные языки

Сообщение bogus »

t.t., как математик, объяснит конечно лучше.
Но пока он думает, вот мои 15 коп.:

1) Функция для вычисления факториала. (из учебника по Haskell, близко к тексту):

Код: Выделить всё

fact int -> int
fact 0 = 1
fact n = n * fact (n-1)


2) http://haskell.org
3) это Очень интересно
4) t.t. - это где-нибудь кроме науки применяется?
Как всякое несовершенное существо я могу ошибаться. Простите меня.
jabberId = foldl (flip (:)) [] "ur.rebbaj@43sugob"
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: функциональные языки

Сообщение t.t »

(bogus @ Пятница, 15 Октября 2004, 10:11) писал(а):t.t., как математик, объяснит конечно лучше.
Но пока он думает, вот мои 15 коп.:

1) Функция для вычисления факториала. (из учебника по Haskell, близко к тексту):

Код: Выделить всё

fact int -> int
fact 0 = 1
fact n = n * fact (n-1)
Это скорее объясняет, что такое рекурсивное программирование. Функциональное почти всегда использует рекурсивное, но "рекурсивное" не равно "функциональное", оно может с тем же успехом применяться и в процедурном программировании, и в объектном.
(bogus @ Пятница, 15 Октября 2004, 10:11) писал(а):4) t.t. - это где-нибудь кроме науки применяется?
Смотря что называть наукой, наверное. Экспертные системы, например, -- это наука? А самообучающиеся алгоритмы? И там, и там функциональное программирование применяется весьма успешно; впрочем, как и логическое. Хотя, пожалуй всё равно не только в науке, emacs -- живой тому пример.

Вообще, сейчас есть, скажем, два лагеря. Один придерживается того мнения, что функциональное программрование -- это дело прошлое (мотивируя тем, что оно было придумано ещё в начале 60-х), и будущее только за ООП. Другие же считают, что ФП и сейчас очень актуально, и будет актуально и далее. То же ООП, кстати, многие свои фичи взяло именно из ФП. С другой стороны, все новые веяния очень легко проникают в ФП, т.к. с помощью функций можно описать даже не практически всё, а ещё и теоретически всё.

Сразу сделаю оговорку, что то, что называют функцией в таких языках, как си, паскаль, или шелл, перл, -- это на самом деле не функция (в математическом понимании), а процедура. Т.е. все широко распространённые сейчас языки берут начало от процедурного программирования.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
brazhe
Сообщения: 89
Контактная информация:

Re: функциональные языки

Сообщение brazhe »

Спасибо, немного проясняется. Вот откуда у RMS любовь к рекурсивным идиомам.
На Haskell.org заходил, даже почитал статью шведа из Гётеборга о Why Functional Languages Matter или что-то в этом роде. Мало, что понял, но ощущение о всеобщей рекурсивности осталось :) Мне бы по-простому. И кстати, haskell, Lisp (куча разных?), ocaml, Smalltalk -- это все функциональные языки? Есть ли какие-то ещё, какая между ними разница?

И еще, вроде какой-то Windows Manager на Lisp'e писан, или я ошибаюсь?
Спасибо сказали:
Аватара пользователя
Jan2ary
Бывший модератор
Сообщения: 630
Статус: Тщедушный очкарик

Re: функциональные языки

Сообщение Jan2ary »

Я когда-то прологом увлекался. Очень красивый и забавный язык, полностью переворачивает мышление!
Не шалю, никого не трогаю, починяю примус...
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: функциональные языки

Сообщение t.t »

Вот, немного вспомнил. (Я буду говорить на примере Common Lisp, т.к. с ним знаком, но думаю, принципы везде те же).

Вцелом функциональное программирование базируется на одном единственном понятии -- понятии списка. Вся соль в том, что функции тоже не отделяются от списков. Любая функция -- это список. Любой список можно использовать как функцию. Отсюда происходит концепция так называемого data driven programming (программирования, управляемого данными): т.к. любая функция есть список, а выражения и операторы -- частные случаи функций, то любой список (т.е. любые данные) можно вычислить как выражение. Ещё одна "фишка" ФП -- возможность реализовать многозначные функции, а также функции высшего порядка: функционалы (функции от функций) и функциональнозначные функции.

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

Базовых функций изначально в лиспе было всего пять: car (список -> голова списка), cdr (список -> хвост списка), cons (голова, хвост -> список), eq (проверка на равенство) и cond (условная функция). Всё остальное можно написать, используя всего пять основных функций. До стандартизации Common Lisp в него было введено, чисто для удобства программистов, несколько дополнительных понятий. Например, арифметические и прочие математические операции; до того это всё можно было реализовать только на базе целочисленной математики, где каждое число представлялось списком соответственной длины, что не очень удобно с точки зрения машинных ресурсов (неудобства для программиста быть не могло по определению, т.к. такое "достижение" ООП, как перегрузка операций, на самом деле берёт своё начало из ФП).

Вобщем, я разговорился, могу продолжать ещё долго, но смысла в этом мало, лучше спрашивайте, если что.
Добавлено:
(Jan2ary @ Пятница, 15 Октября 2004, 11:02) писал(а):Я когда-то прологом увлекался. Очень красивый и забавный язык, полностью переворачивает мышление!
Пролог -- тоже классная штука, но это не функциональное, а логическое программирование. ФП и ЛП можно полностью смоделировать одно через другое, но изначально это всё-таки совершенно разные вещи (хотя по "концепции" друг на друга похожи больше, чем на ставшие традиционными методы программирования).
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
JaGoTerr
Сообщения: 380

Re: функциональные языки

Сообщение JaGoTerr »

Ну вы, блин, даёте...
Smalltalk - это первый ЧИСТЫЙ ОО язык. С++, Java и прочие C# не дотягивают до того уровня объектно-ориентированности, который есть в Smalltalk. Это во-первых.
Prolog - это язык логического программирования. А не функционального. Там основой являююются предикатные функции, повторные вычисления и пр.
А касаемо функциональных языков...Идеология (вернее высшая идея :)) - всё есть функция. Например есть некоторый список. Его можно использовать как список, а можно вызвать, как функцию! Это, наверное, тяжело понять просто так вот, на словах. Но если попробовать (а это очень просто) - достаточно интересная штука.

Долго писАл, меня опередили :)
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: функциональные языки

Сообщение t.t »

(brazhe @ Пятница, 15 Октября 2004, 10:59) писал(а):И кстати, haskell, Lisp (куча разных?), ocaml, Smalltalk -- это все функциональные языки? Есть ли какие-то ещё, какая между ними разница?
Из каких-то ещё первой в голову пришла схема (schema). Разница между ними только, так сказать, на уровне реализации -- синтаксиса и структуры "построения языка"; база у всех (мне известных, по крайней мере) общая.
(brazhe @ Пятница, 15 Октября 2004, 10:59) писал(а):И еще, вроде какой-то Windows Manager на Lisp'e писан, или я ошибаюсь?
Возможно. Кажется, где-то тоже такое слышал.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
bogus
Сообщения: 160

Re: функциональные языки

Сообщение bogus »

(brazhe @ Пятница, 15 Октября 2004, 10:59) писал(а):И еще, вроде какой-то Windows Manager  на Lisp'e писан, или я ошибаюсь?

Sawfish, если не ошибаюсь. Только он не на лиспе написан, а использует диалект лиспа в качестве скриптового интерфейса (вот загнул :blink:)
Вроде, действительно, емакса
Как всякое несовершенное существо я могу ошибаться. Простите меня.
jabberId = foldl (flip (:)) [] "ur.rebbaj@43sugob"
Спасибо сказали:
Аватара пользователя
JaGoTerr
Сообщения: 380

Re: функциональные языки

Сообщение JaGoTerr »

(brazhe @ Пятница, 15 Октября 2004, 10:59) писал(а):И еще, вроде какой-то Windows Manager  на Lisp'e писан, или я ошибаюсь?


Я даже знаю одну операционную систему, написанную на лиспе... :megalol:

(Если кто-то тормозит, то я про emacs)
Спасибо сказали:
Аватара пользователя
bogus
Сообщения: 160

Re: функциональные языки

Сообщение bogus »

К слову о лиспе...
Одним из требований чисто функционального (pure functional) языка явл. отсутствие у функций побочных эффектов. Кроме всего прочего, это означает отсутствие переменных. В хаскеле это выполняется, а в лиспе нет. Правда, я смотрел только на реализацию лиспа librep; может он неправильная :)
Как всякое несовершенное существо я могу ошибаться. Простите меня.
jabberId = foldl (flip (:)) [] "ur.rebbaj@43sugob"
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: функциональные языки

Сообщение t.t »

(bogus @ Пятница, 15 Октября 2004, 12:57) писал(а):К слову о лиспе...
Одним из требований чисто функционального (pure functional) языка явл. отсутствие у функций побочных эффектов. Кроме всего прочего, это означает отсутствие переменных. В хаскеле это выполняется, а в лиспе нет. Правда, я смотрел только на реализацию лиспа librep; может он неправильная
Нет, она правильная. Последнее время в лиспе не так жёстко подходят к "чистой функциональности" языка. Т.е. есть, так сказать, ядро языка, и в этом ядре выполняются все формальные требования к функциональному программированию, а есть большое количество функций, не входящих в это ядро, для которых сохраняются основные принципы функциональности, но сняты многие запреты (например, запрет на побочные эффекты). Пришли к этому потому, что поняли мощность сочетаний чистого ФП с другими методами программирования; и сейчас в любом лиспе, соответствующем стандарту, можно как ограничиваться чистым ФП, так и сочетать его с другими подходами (процедурным, структурным, объектным, логическим). Это действительно даёт огромную свободу в разработке.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Ответить