Подтвердить что ты не робот

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

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

  • Инкапсуляция
  • наследование
  • полиморфизм

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

В двух словах,

  • Исчисление лямбда
  • Функции более высокого порядка
  • Неизменность
  • Нет побочных эффектов

Ответ 3

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

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

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

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

То, что я пытаюсь сказать, заключается в том, что ваши "основные понятия OO" не имеют никакого отношения к OO. Я, например, утверждал бы, что на самом деле нет принципиальных концепций OO.

Ответ 4

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

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

На каком-то уровне все это есть.

Ответ 5

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

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

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

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

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

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

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

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