Каковы основные понятия в функциональном программировании? - PullRequest
53 голосов
/ 11 июля 2009

В объектно-ориентированном программировании мы можем сказать, что основные понятия:

  1. Инкапсуляция
  2. Наследование
  3. полиморфизм

Что бы это было в функциональном программировании?

Ответы [ 5 ]

64 голосов
/ 11 июля 2009

В сообществе нет единого мнения относительно основных понятий в функциональном программировании. В Почему функциональное программирование имеет значение (PDF) , Джон Хьюз утверждает, что это функции высшего порядка и ленивая оценка. Саймон Пейтон Джонс (Simon Peyton Jones) в книге «1003 * Ношение волосяной рубашки: ретроспектива на Хаскелле» говорит, что подлинной необходимостью является не лень, а чистота. Ричард Берд согласился бы. Но есть целая толпа программистов на Scheme и ML, которые с удовольствием пишут программы с побочными эффектами.

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

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

  • Средства объединения функций с другими функциями для решения задач. Никто не делает это лучше, чем Джон Хьюз.

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

  • Полиморфизм , независимо от того, поддерживается ли он компилятором или нет, является основной ценностью функциональных программистов. Смущает то, что программисты на C ++ называют эту концепцию «общим программированием». Когда полиморфизм реализуется компилятором, это, как правило, вариант Хиндли-Милнера , но более мощная System F также является мощной основой для функциональных языков. А с такими языками, как Scheme, Erlang и Lua, вы можете выполнять функциональное программирование без системы статических типов.

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

39 голосов
/ 11 июля 2009

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

В двух словах

  1. Лямбда-исчисление
  2. Функции высшего порядка
  3. Неизменность
  4. Без побочных эффектов
14 голосов
/ 11 июля 2009

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

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

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

Полиморфизм в школе «ОО» достигается посредством подтипирования (наследования). Существует более общий тип полиморфизма, известный как параметрический полиморфизм (a.k.a. generics), который, как вы найдете, поддерживается чисто функциональными языками программирования. Кроме того, некоторые поддерживают «более высокие виды», или дженерики более высоких порядков (a.k.a. полиморфизм конструкторов типов ).

То, что я пытаюсь сказать, - это то, что ваши «основные концепции ОО» никоим образом не относятся к ОО. Я бы, например, утверждал, что на самом деле не существует каких-либо основных концепций ОО.

4 голосов
/ 14 июля 2009

Позвольте мне повторить ответ, который я дал на одном из обсуждений в группе функционального программирования в Бангалоре:

Функциональная программа состоит только из функций. Функции вычисляют значения из их входов. Мы можем противопоставить это императиву программирование, где по мере выполнения программы значения изменяемых места меняются. Другими словами, в C или Java переменная с именем X относится к местоположению, значение которого изменяется. Но в функционале Программирование X - это имя значения (а не местоположения). Где бы то ни было X находится в области видимости, он имеет то же значение (т. Е. прозрачный). В FP функции также являются значениями. Они могут быть переданы как аргументы для других функций. Это известно как функционал высшего порядка программирование. Функции высшего порядка позволяют нам моделировать удивительное разнообразие узоры. Например, посмотрите на функцию map в Lisp. Это представляет шаблон, в котором программист должен сделать что-то каждый элемент списка. Это «что-то» закодировано как функция и передан в качестве аргумента на карту.

Как мы видели, наиболее заметная особенность FP - это побочный эффект свободность. Если функция делает что-то большее, чем вычисление значения от его ввода, то это вызывает побочный эффект. Такие функции не допускается в чистом ФП. Легко протестировать функции без побочных эффектов. Не существует глобального состояния для настройки перед запуском теста и нет глобального состояния для проверки после запуска теста. Каждая функция может быть проверены независимо, просто предоставив свой вклад и изучив возвращаемое значение Это облегчает написание автоматизированных тестов. Другая Преимущество свободы от побочных эффектов в том, что она дает вам лучший контроль на параллелизме.

Многие языки FP правильно обрабатывают рекурсию и итерацию. Они делают это путем поддерживая то, что называется хвостовой рекурсией. Что такое хвостовая рекурсия? если функция вызывает себя, и это последнее, что она делает, она удаляет текущий кадр стека сразу. Другими словами, если функция вызывает себя хвост-рекурсивно 1000 раз, она не растет стек глубиной 1000. Это делает специальные циклические конструкции не нужно в этих языках.

Лямбда-исчисление является наиболее упрощенной версией языка FP. Языки FP более высокого уровня, такие как Haskell, компилируются в Lambda Исчисление. У этого есть только три синтаксических конструкции, но все же это достаточно выразительным, чтобы представить любую абстракцию или алгоритм.

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

Спасибо, - Виджай

Оригинальная ссылка для обсуждения: http://groups.google.co.in/group/bangalore-fp/browse_thread/thread/4c2cfa7985d7eab3

3 голосов
/ 11 июля 2009

Абстракция, процесс создания функции путем параметризации некоторой части выражения.

Приложение, процесс оценки функции путем замены ее параметров конкретными значениями.

На каком-то уровне это все, что нужно.

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