Когда использовать функциональный язык программирования? - PullRequest
78 голосов
/ 29 декабря 2008

В каких ситуациях мне следует выбирать использование функционального языка программирования над более подробным объектно-ориентированным языком, таким как C ++, C # или Java?

Я понимаю, что такое функциональное программирование, что я не совсем понимаю, для каких типов проблем это идеальное решение?

Ответы [ 8 ]

85 голосов
/ 29 декабря 2008

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

Таким образом, именно здесь начинается параллельная обработка.

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

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

Вот отличная статья о функциональном программировании, которая вам понравится.

47 голосов
/ 29 декабря 2008

Функциональные языки, на мой взгляд, хороши в основном для двух вещей: игровые ИИ и математические вычисления. Это хорошо в игровых ИИ из-за его хороших манипуляций со списком (по крайней мере, в Lisp и Scheme), а также для математических вычислений из-за его синтаксиса. Scheme, Lisp и Haskell имеют синтаксис, который упрощает чтение математических вычислений. Последнее, что я должен добавить, это то, что функциональные языки - это действительно забавные языки. Мой курс по Схеме был одним из самых веселых.

13 голосов
/ 29 декабря 2008

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

Нарисуйте сетку с типами данных в верхней части и операциями с этими типами данных в левой части. Если вы нарезаете сетку вертикально, вы делаете OO; если вы нарезаете сетку горизонтально, вы делаете FP.

Мой ответ заключается в том, что FP - это абсолютно жизнеспособный подход к программированию с таким широким спектром применения, как ОО. Как и в любом обсуждении по выбору языка программирования, я думаю, что более важные вопросы:

  1. Есть ли у вас время, чтобы инвестировать в изучение новой нотации и нового мышления?
  2. Какой из языков, которые вы рассматриваете, имеет достаточно богатые библиотеки, чтобы вы не застряли, изобретая какое-то колесо?

Что касается первого вопроса, если вы делаете это в первую очередь для обучения, я бы посоветовал взглянуть на Haskell из-за широкого спектра вспомогательных материалов (книг, статей, активного сообщества, и др.)

Что касается второго вопроса, у Haskell есть хороший набор библиотек (хотя некоторые из них более развиты, чем другие), но Scala (гибридный OO-функциональный язык, работающий на JVM) имеет те преимущества, что вы можете постепенно переходить в функциональный стиль, и у вас есть полный спектр доступных для Java библиотек.

10 голосов
/ 29 декабря 2008

Практически все, что вы можете сделать в PP, можно сделать в FP, и то же самое в обратном порядке. Это просто еще один способ что-то кодировать - другой взгляд на проблему и другой способ ее решения.

Однако, поскольку не многие люди используют FP, проблема больше связана с отсутствием хороших библиотек, переносимостью / удобством сопровождения (поскольку сопровождающий имеет больше шансов понять что-то написанное на C ++, чем Scheme), а также с отсутствием документации и сообщества. Я знаю, что есть некоторые документы, однако, сравните это с C ++, C # или Java, и вы поймете, что я имею в виду.

Однако, если вы действительно хотите использовать FP, вы можете использовать этот стиль даже в C ++ и C #. Конечно, это не будет 100% FP, если вы используете стандартную библиотеку. К сожалению, я не думаю, что C # оптимизирован для использования с функциональным программированием и, вероятно, создаст много проблем с производительностью.

Это скорее субъективный пост, что я думаю о ФП. Это не строгая декларация.

4 голосов
/ 29 декабря 2008

Функциональные языки хороши во многих ситуациях. Это зависит от библиотек конкретного функционального языка.

Как бы вы ответили на вопрос «Когда использовать объектно-ориентированный язык программирования?»?

3 голосов
/ 29 декабря 2008

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

1 голос
/ 29 декабря 2008

В общем, используйте язык, на котором проще всего выразить решение проблемы. Для функционального программирования это когда решение проблемы легко выражается через функции , отсюда и название. Обычно это хорошо для математических операций, AI, сопоставления с образцом; в общем, все, что может быть разбито на набор правил, которые должны применяться для получения ответа. Вы действительно можете определить «лучший» язык для использования только после того, как достаточно проанализировали свою проблему. Здесь псевдокод пригодится. Если вы пишете псевдокод, похожий на FP, используйте FP.

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

Обратите внимание также на то, что возможно имитировать FP в ОО-языках через искусно разработанные API. Например, я видел множество библиотек Java (пример JMock), которые используют цепочку методов для имитации FP DSL. Тогда вы увидите такие конструкции, как:

logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );

По сути, это строит функцию, которая оценивается, чтобы определить, является ли какая-то вызывающая последовательность на ложном объекте корректной. (пример украден у http://www.jmock.org/yoga.html)

Другим FP-подобным синтаксисом в других языках OO является использование замыканий, например в Ruby.

1 голос
/ 29 декабря 2008

Из того, что я видел, это скорее вопрос вкуса, чем функциональности (без каламбура). Ни в одном из стилей языка нет ничего такого, что могло бы сделать его лучше или хуже в определенных задачах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...