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

96

Как вы думаете, в чем преимущества функционального программирования? А как они сегодня относятся к программистам?

Каковы самые большие различия между функциональным программированием и ООП?

Rayne
источник
5
Парадокс Блаба. paulgraham.com/avg.html
missingfaktor

Ответы:

75

Стиль функционального программирования заключается в описании того, что вы хотите, а не в том, как этого добиться. то есть: вместо создания цикла for с переменной-итератором и перехода через массив, который что-то делает с каждой ячейкой, вы бы сказали, что эквивалент «эта метка относится к версии этого массива, где эта функция была выполнена на всех элементы ".

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

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

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

Некоторые преимущества производительности можно увидеть и в контексте однопроцессорной системы, в зависимости от способа написания программы, поскольку большинство функциональных языков и расширений поддерживают ленивую оценку. В Haskell вы можете сказать: «эта метка представляет собой массив, содержащий все четные числа». Такой массив бесконечно велик, но вы можете запросить 100 000-й элемент этого массива в любой момент, не зная - во время инициализации массива - какое наибольшее значение вам понадобится. Стоимость будет рассчитана только тогда, когда она вам понадобится, и не более того.

Крис Уэнам
источник
12
Мне кажется, ваш первый абзац ближе к описанию декларативного реляционного программирования, такого как Prolog, чем функционального программирования.
McPherrinM
6
@McPherrinM: функциональные языки являются декларативными, а не императивными.
Ли Райан,
2
Кажется, вы путаете DP с IP, с процедурным и FP . FP обеспечивает разделение задач, подчеркивая композицию функций, то есть разделяя зависимости между подвычислениями детерминированного вычисления.
Шелби Мур III
2
@LieRyan неверно. См. Ссылку в моем предыдущем комментарии
Shelby Moore III
Параллелизм - это наличие нескольких потоков, которые могут взаимодействовать друг с другом, что обязательно. Одновременное выполнение нескольких независимых вычислений называется параллелизмом . См. En.wikipedia.org/wiki/Concurrency_(computer_science)
Лямбда-фея,
29

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

Кирк Штраузер
источник
28
это преимущество изучения, а не преимущество самой парадигмы
Мо
2
Но действительно ли они разделены? С точки зрения автора, задавшего вопрос, я бы сказал, что нет - они, скорее всего, ищут выгоды в совокупности затрат на изучение функционального языка.
Кендалл Хелмштеттер Гельнер,
3
«Это преимущество изучения, а не польза от самой парадигмы». Парадигма проникнет в вашу другую работу с ООП и может помочь упростить вашу разработку там. Вы можете подойти к решению проблем с помощью «вычислить этот вывод из этого ввода» и «составить эти две функции, которые вычисляют новые данные» вместо «подождите --- каково было состояние некоторой общей переменной там?» и «Я заставил эти процедуры выполняться в правильном порядке?». Серьезно, вы получаете эти преимущества (от понимания парадигмы FP) в Python, C #, C ++, Java, вы называете это.
Джаред Апдайк,
11

Почему так важно функциональное программирование
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

Аннотация

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

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

Роберт Харви
источник
10

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

Если вы говорите о вычислимости, то, конечно, нет ничего возможного в функциональном, но не императивном программировании (или наоборот).

Смысл различных парадигм программирования не в том, чтобы сделать возможным то, что было невозможно раньше, а в том, чтобы упростить то, что раньше было сложно.

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

sepp2k
источник
5

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

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

Сэмюэл Джек
источник
5

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

Функциональное программирование также увеличивает модульность - вы часто можете видеть слишком длинные методы / функции в императиве - вы почти никогда не увидите функцию длиной более пары строк. А так как все разделено - многократное использование значительно улучшено, а модульное тестирование очень и очень просто.

Божидар Бацов
источник
3

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

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

Сонер Генюль
источник
1

Не думайте о функциональном программировании как о «потребности». Вместо этого думайте об этом как о еще одной технике программирования, которая откроет вам разум, так же как ООП, шаблоны, язык ассемблера и т. Д. Могли полностью изменить ваш образ мышления, когда (если) вы их изучили. В конечном итоге изучение функционального программирования сделает вас лучшим программистом.

Джастин Этье
источник
0

Если вы еще не знакомы с функциональным программированием, то его изучение даст вам больше способов решения проблем.

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

Многие языки предоставляют как FP, так и OOP, включая OCaml, C # 3.0 и F #.

Ура, Джон Харроп.

JD
источник