Преимущества и использование функционального языка программирования

Возможный дубликат:
Почему функциональные языки?

Я начал программировать с C/С++, VB, и в конечном итоге Python - все императивные языки. Я прочитал курс о языках программирования и узнал свой первый функциональный язык - OCaml. Это было ужасно.

Синтаксис и другие ужасы в стороне, OCaml принял мой императивный мыслительный процесс и выбросил его из окна. Это было неприятно. Я настаивал на том, что все, что можно было бы сделать функционально, можно было бы сделать также императивно. Я думал о функциональном программировании как обязательном программировании без конечности (побочные эффекты). В ответ на мое разочарование единственным преимуществом моего профессора могло стать способность FPL распараллелить функции, свободные от побочных эффектов.

В любом случае, достаточно разговоров.

  • Каковы некоторые преимущества, которые предлагают FPL выше IPL?
  • Есть ли что-нибудь, что можно легко сделать в FPL, что нелегко сделать в IPL?
  • Существуют ли какие-либо реальные примеры использования FPL, или они в основном служат академическими упражнениями? (Когда я говорю о реальном мире, я имею в виду проект, который в значительной степени полагается на функциональный аспект языка и не вливает FPL в сценарий, где он не принадлежит).

Спасибо,
Advait

Ответ 1

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

Одна из очень приятных особенностей функциональных языков заключается в том, что их структура позволяет применять вывод типа Хиндли-Милнера. Это система типов, используемая в SML, OCaml и множество других функциональных языков. Это, по-видимому, приводит к снижению частоты ошибок и способно сэкономить вам много времени и сил, обнаружив ошибки перед ошибками компиляции.

Аргумент автоматической параллелизации немного переработан, особенно потому, что обещание просто не наступило. Я написал явно параллельный код в функциональных языках, и это лучше, ИМХО, чем делать что-то подобное на Java или тому подобное.

Анекдотически, по крайней мере, я бы не стал первым человеком, утверждающим, что изучение функционального языка делает вас лучшим императивным программистом! Этот дискомфорт, который вы ощущали в том, что ваш "императивный" процесс мышления прерывается при использовании OCaml, на самом деле является действительно хорошим процессом. Это заставляет вас подвергать сомнению предположения и мешает вам писать код определенным образом только потому, что вы всегда так делали.

Что касается использования в реальном мире, вы можете посмотреть на семинары Коммерческие пользователи функционального программирования. Существуют также очень большие проекты, написанные на различных функциональных языках, хотя большинство из них, вероятно, имеют ограниченный интерес за пределами довольно небольших общин. Обозначения теоремы Coq и Isabelle написаны соответственно в Ocaml и SML.

Все, что вы делаете, я бы упорствовать. Я долгое время стучал головой о МЛ, прежде чем что-то наконец щелкнуло. В эти дни я не уверен, что даже помню, как работают Java или C, потому что у меня не было необходимости в них в течение длительного времени... Я просто использую ML!

Ответ 2

  • Когда, наконец, удается заставить замолчать его вразумительный (ошибочно) обученный ум, FP на самом деле становится проще и веселее, чем IP.

  • FP имеет тенденцию быть более безопасным, менее подверженным ошибкам, из-за его декларативного характера.

  • Мне нравится думать, что параллелизирующий императивный код удваивает его сложность (попробуйте себя с нетривиальным параллельным приложением). IMO, FP значительно сокращает разрыв, благодаря отсутствию синхронизации во многих случаях.

  • Цитируя Gian, изучение FP делает вас более разумным императивным программистом...