Является ли Эрланг действительно функциональным языком?

Я все время слышу, что Erlang является функциональным языком, но легко вызвать базы данных или бесплатный побочный эффект от функции, а команды легко упорядочиваются с помощью запятых между ними, как Ruby или другой язык, так где же "функциональная" часть Erlang?

4 ответа

Центральная идея заключается в том, что каждый процесс является функциональной программой по входному потоку сообщений. Результатом функциональной программы является поток вывода сообщений другим пользователям. С этой точки зрения Erlang - довольно чистый функциональный язык; нет деструктивных обновлений структур данных (например, setcar в Lisp и большинстве схем).

За некоторыми исключениями все встроенные функции, такие как операции с таблицами ETS, также следуют этой модели: помимо проблем с эффективностью эти BIF действительно могут быть реализованы с чистыми процессами Erlang и передачей сообщений.

Итак, язык Erlang является функциональным, но коллекция взаимодействующих процессов Erlang - это совсем другое дело. Каждый процесс является текущим вычислением, и поэтому он имеет текущее состояние, которое может измениться по отношению к другим процессам. Даже база данных - это еще один процесс в этом отношении.

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


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

Полезно и мощно иметь сильный контроль над изменчивостью значений и побочными эффектами, но я считаю, что они являются периферийными для функционального программирования. Приятно иметь, но не обязательно. Даже на языках, которые имеют эти свойства, всегда есть способ избежать чистоты парадигмы. 1

Между действительно чистыми FP-языками существует оттенок серого, который вы фактически не можете использовать для чего-либо практического и языков, которые действительно довольно нечисты, но все еще имеют для них характер FP:

  • Книга FP: Вводные книги на языках FP часто показывают только подмножество языка со всеми примерами, выполненными внутри языка REPL, так что вы никогда не увидите, как чисто функциональная парадигма нарушается. Хорошим примером этого является схема, представленная в The Little Schemer.

    Вы можете отказаться от чтения такой книги с ложным впечатлением, что языки FP не могут на самом деле ничего полезного.

  • Haskell: Создатели Haskell отправились на необычные длины, чтобы скрыть примесь через знаменитую монаду I/O monad. Все на одной стороне стены чисто функционально, поэтому компилятор уверенно рассуждает о коде.

    Но главное, несмотря на существование этой стены, вы должны использовать монаду ввода-вывода, чтобы получить что-нибудь полезное в Haskell. 2 В этом смысле Haskell не так "чистым", как некоторые хотели бы, чтобы вы поверили. Монада ввода-вывода позволяет вам создавать любое "нечистое" программное обеспечение, которое вам нравится в Haskell: клиенты базы данных, высокооцененные GUI и т.д.

  • Erlang: Имеет неизменные значения и первоклассные функции, но не имеет прочной стены между основным языком и нечистыми битами.

    Erlang поставляется с Mnesia, дисковой памятью в СУБД в памяти, которая так же нечиста, как и программное обеспечение. На практике это практически не отличается от глобальной переменной. Erlang также имеет большую поддержку для общения с внешними программами через ports, сокеты и т.д.

    Эрланг не навязывает вам какую-либо политику чистоты, программист, на уровне языка. Он просто дает вам инструменты и позволяет вам решить, как их использовать.

  • OCaml и F #: Эти тесно связанные языки многопарадигмы включают в себя как чисто функциональные элементы, так и императивные и объектно-ориентированные характеристики.

    Обязательные биты программирования позволяют делать такие вещи, как запись традиционного цикла for с изменяемой переменной счетчика, тогда как чистая программа FP, вероятно, попытается перечислить список вместо этого, чтобы достичь того же результата.

    Части OO практически бесполезны без ключевого слова mutable, которое превращает value в variable, так что компилятор не будет жаловаться, если вы измените значение переменной. Переменные переменные в OCaml и F # имеют некоторые ограничения, но вы можете избежать даже этих ограничений с помощью ref.

    Если вы используете F # с .NET, вы будете мутировать значения все время, потому что большая часть .NET изменена, так или иначе. Любой объект .NET с установленным свойством может быть изменен, например, и весь материал GUI по своей сути имеет побочные эффекты. Единственной неотъемлемой частью .NET, которая сразу приходит в голову, является System.String.

    Несмотря на все это, никто не будет утверждать, что OCaml и F # не являются функциональными языками программирования.

  • JavaScript, R, Lua, Perl...: Существует множество языков, которые даже менее чисты, чем OCaml, которые по-прежнему могут считаться функциональными в некотором смысле. Такие языки имеют первоклассные функции, но значения по умолчанию изменяются.

Foototes:

  • Любой действительно чистый FP-язык является игрушечным языком или кем-то исследовательским проектом.

  • То есть, если ваша идея "полезная" заключается в том, чтобы сохранить все в ghci REPL. Вы можете использовать Haskell как прославленный калькулятор, если хотите, так что он чистый FP.


Да, это функциональный язык. Это не чистый функциональный язык, такой как Haskell, но опять же, ни один LISP (и никто не утверждает, что LISP не работает).

Обработка сообщений/обработка процесса Erlang - это реализация модели Actor. Вы можете утверждать, что Erlang - это актерский язык с функциональным языком, используемым для отдельных участников.


Функциональная часть состоит в том, что вы склонны передавать функции. Большинство langauges могут использоваться как в качестве функционального языка, так и в качестве обязательного языка, даже C (вполне возможно сделать программу, состоящую только из указателей функций и констант).

Я думаю, что отличительным фактором обычно является отсутствие изменяемых переменных в функциональных языках.

licensed under cc by-sa 3.0 with attribution.