Когда использовать функциональный язык программирования?
В каких ситуациях мне следует выбирать использование функционального языка программирования над более подробным объектно-ориентированным языком, таким как C++, C# или Java?
Я понимаю, что такое функциональное программирование, что я не совсем понимаю, для каких типов проблем это идеальное решение?
9 ответов
Функциональные языки, на мой взгляд, хороши в основном для двух вещей: игровые ИИ и математические вычисления. Это хорошо в игровых ИИ из-за его хороших манипуляций со списком (по крайней мере, в Lisp и Scheme), а также для математических вычислений из-за его синтаксиса. Scheme, Lisp и Haskell имеют синтаксис, который упрощает чтение математических вычислений. Последнее, что я должен добавить, это то, что функциональные языки - это действительно забавные языки. Мой курс по Схеме был одним из самых веселых.
Я сам провел некоторые исследования в этой области и подумал, что могу добавить CONCURRENCY в список причин, по которым стоит использовать функциональный язык. Посмотрите, в какой-то момент в ближайшем будущем скорость процессора не сможет возрасти при использовании той же технологии процессора. Физика архитектуры этого не допустит.
Так вот где начинается параллельная обработка.
К сожалению, большинство языков ООП не могут использовать преимущества нескольких процессоров одновременно из-за взаимозависимости между данными.
В чисто функциональных языках программирования компьютер может запускать две (или многие другие) функции одновременно, поскольку эти функции не изменяют внешнюю информацию о состоянии.
Вот отличная статья о функциональном программировании, которая вам понравится.
Мой друг процитировал одного из своих профессоров в колледже, который сказал что-то вроде следующего:
Нарисуйте сетку с типами данных в верхней части и операциями с этими типами данных в левой части. Если вы нарезаете сетку вертикально, вы делаете OO; если вы нарезаете сетку горизонтально, вы делаете FP.
Мой ответ заключается в том, что FP - это абсолютно жизнеспособный подход к программированию с таким широким спектром применения, как ОО. Как и в любой дискуссии по выбору языка программирования, я думаю, что более важные вопросы:
- Есть ли у вас время, чтобы инвестировать в изучение новой нотации и нового мышления?
- Какой из языков, которые вы рассматриваете, имеет достаточно богатые библиотеки, чтобы вы не застряли, изобретая какое-то колесо?
Что касается первого вопроса, если вы делаете это в первую очередь для обучения, я бы посоветовал взглянуть на Haskell из-за широкого спектра вспомогательных материалов (книги, статьи, активное сообщество и т. Д.)
Что касается второго вопроса, у Haskell есть хороший набор библиотек (хотя некоторые из них более зрелые, чем другие), но Scala (гибридный OO-функциональный язык, работающий на JVM) имеет преимущества, которые вы можете более постепенно переходить в функциональный стиль. и у вас есть полный спектр доступных для Java библиотек.
Практически все, что вы можете сделать в PP, можно сделать в FP, и то же самое в обратном порядке. Это просто еще один способ что-то кодировать - другой взгляд на проблему и другой способ ее решения.
Однако из-за того, что не многие люди используют FP, проблема больше связана с отсутствием хороших библиотек, переносимостью / ремонтопригодностью (поскольку у сопровождающего больше шансов понять что-то написанное на C++, чем на Scheme), а также с отсутствием документации и сообщества. Я знаю, что есть некоторые документы, однако, сравните это с C++, C# или Java, и вы поймете, что я имею в виду.
Однако, если вы действительно хотите использовать FP, вы можете использовать этот стиль даже в C++ и C#. Конечно, это не будет 100% FP, если вы используете стандартную библиотеку. К сожалению, я не думаю, что C# оптимизирован для использования с функциональным программированием и, вероятно, создаст много проблем с производительностью.
Это скорее субъективный пост, что я думаю о ФП. Это не строгая декларация.
Функциональные языки хороши во многих ситуациях. Это зависит от библиотек конкретного функционального языка.
Как бы вы ответили на вопрос "Когда использовать объектно-ориентированный язык программирования?"?
Хотя это довольно субъективный вопрос, я просто хотел бы добавить, что функциональные языки часто используются для анализа языков, специфичных для предметной области; функциональная природа хорошо подходит для разбора грамматик.
Я думаю, что предыдущие сообщения верны, вот краткий список, функциональное программирование — идеальное решение для следующего:
- обработка без сохранения состояния
- математические уравнения, включая ML (машинное обучение)
- неизменяемые процессы
- когда вам нужен масштабируемый параллелизм
Из того, что я видел, это больше вопрос вкуса, чем функциональности (без каламбура). Ни в одном стиле языка нет ничего такого, что делает его лучше или хуже в определенных задачах.
В общем, используйте язык, на котором проще всего выразить решение проблемы. Для функционального программирования это когда решение проблемы легко выражается в терминах функций, отсюда и название. Обычно это хорошо для математических операций, 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.