2008-09-24 3 views
79

Что вы думаете о преимуществах функционального программирования? И как они применяются к программистам сегодня?Каковы преимущества функционального программирования?

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

+5

Парадокс Blub. http://www.paulgraham.com/avg.html – missingfaktor 2010-05-24 02:51:43

+0

См. http://c2.com/cgi/wiki?AdvantagesOfFunctionalProgramming – EliuX 2016-01-31 20:57:13

ответ

64

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

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

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

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

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

+9

Я чувствую, что ваш первый абзац ближе к описанию декларативного реляционного программирования, такого как Prolog, чем функциональное программирование. – McPherrinM 2010-05-23 18:54:47

+6

@McPherrinM: функциональные языки являются декларативными, а не императивными. – 2010-09-03 05:26:55

5

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

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

25

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

0

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

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

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

Cheers, Jon Harrop.

3

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

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

8

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

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

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

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

0

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

2

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

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

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