2010-07-23 1 views
10

Можно создать дубликат:
Why functional languages?Преимущества и использование функционального языка программирования

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

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

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

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

Спасибо,
Advait

+2

основном дублируют: http://stackoverflow.com/questions/36504/ почему-функциональные языки –

+1

Просто краткий намек: язык OO «предотвращает» доступ к всем переменным, скрывая их за абстракциями. Это помогает вам контролировать сложность. Аналогично, FP предотвращает манипулирование общим состоянием и, таким образом, помогает вам писать, например, параллелизуемый код. –

+0

Я видел этот пост и заметил, как все говорят о простом параллелизме. Я не был удовлетворен ни одним из ответов. Я считаю, что параллелизация вызовов стандартных функций не обеспечит больших преимуществ по производительности, позволяя программисту явно распараллелить свой собственный код (особенно потому, что накладные расходы на запуск нового потока для выполнения потенциально тривиальной функции довольно велики). Когда выбор предоставляется программисту (когда/что распараллеливать), он получает наибольшую свободу - преимущества производительности параллельности без костылей FPL. – advait

ответ

14

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

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

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

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

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

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

+0

В частности, это видео об использовании функционального программирования в Facebook действительно интересно и довольно убедительно: http://cufp.org/videos/functional-programming-facebook – Gian

+0

«Выразительная сила» покупает вас не так много. Вы можете грести в лодке по всему миру или использовать корабль. У обоих есть «выразительная сила», чтобы взять вас по всему миру. Большинство людей не берут гребную лодку. –

+0

@Rainer, я не уверен, согласны ли вы со мной или нет, но это был основной момент, который я делал. Тривиально верно, что вы можете реализовать большинство вещей на любом разумном языке, это просто вопрос, хотите ли вы этого или нет. – Gian

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

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

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

  4. Приводя Джан, обучение FP сделать вас мудрее императивный программист ...

+3

Существует не так много реальных данных о точке 2. Это в основном ожидание. Если вы посмотрите на компьютеры в самолетах, они могут использовать Ada, который является типично императивным языком. Сопоставимое количество кода, написанного на языке FP (OCAML, Haskell, ...), которое фактически работает на летном компьютере, вероятно, близко к нулю. Единственное место, где используются языки FP, - это проверка настоящих программ, однако код FP не работает на летном компьютере. Их исключениями могут быть исключения, но почти весь безопасный код в реальном мире не находится на одном из этих языков, который вы ожидаете быть более безопасным или менее подверженным ошибкам. –

+0

Да, это правда, что большинство доказательств для пункта 2 анекдотично, но для этого есть много анекдотических доказательств! И, честно говоря, нет большой информации о методах повышения качества программного обеспечения на языке _any_. – Gian

+1

Существует большое количество литературы о написании безопасных систем для самолетов и подобных систем. Если программное обеспечение FP является более безопасным или менее ошибочным, почему он не широко используется в программном обеспечении для критически важных задач (кроме проверки)? проверены ли системы времени выполнения этих языков? –

 Смежные вопросы

  • Нет связанных вопросов^_^