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

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

  • У вас есть время инвестировать в изучение новой нотации и нового образа мышления?
  • Какой из языков, которые вы рассматриваете, имеет достаточно богатые библиотеки, которые вы не будете зацикливаться на новом колесе?

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Обратите также внимание на то, что можно имитировать FP в языках OO с помощью умных 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.