2009-07-11 3 views
49

В объектно-ориентированном программировании, мы могли бы сказать, что основные понятия:Каковы основные концепции функционального программирования?

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

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

+12

Почему вы считаете, что те основные концепции объектно-ориентированного программирования? Многие языки OO не имеют инкапсуляции (например, Python, CLOS). Некоторые языки OO не имеют наследования (например, Self, JavaScript и любой другой язык на основе прототипов), а некоторые делают это, но это не так уж и сложно (практически любой динамический язык или любой другой язык с утиным набором текста). Единственное, что действительно является общим для всех из них, это полиморфизм во время выполнения. –

+2

Из Википедии: «Армстронг, Кварки объектно-ориентированной разработки.В порядке убывания популярности «кварки»: Наследование, Объект, Класс, Инкапсуляция, Метод, Передача сообщений, Полиморфизм, Абстракция » – Nosredna

+0

Носредна, и ни один из них не имеет точного значения. – Apocalisp

ответ

56

Консенсус сообщества относительно основных концепций функционального программирования отсутствует. В Why Functional Programming Matters (PDF) Джон Хьюз утверждает, что это функции более высокого порядка и ленивая оценка. В Wearing the Hair Shirt: A Retrospective on Haskell, Саймон Пейтон Джонс говорит, что реальная сущность - это не лень, а чистота. Ричард Берд согласился бы. Но есть целая толпа программистов Scheme и ML, которые с удовольствием пишут программы с побочными эффектами.

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

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

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

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

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

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

+2

Я думаю, что полиморфизм вводит в заблуждение. Общее программирование на C++ охватывает гораздо больше, чем это (обычно он также использует метапрограммирование, чтобы включить несколько различных реализаций, в зависимости от типа. То, о чем вы говорите, больше похоже на .NET-файлы, чем на C++-шаблоны/универсальное программирование).И эта форма полиморфизма параметрического типа имеет мало общего с тем, что программисты ООП называют полиморфизмом. Думаю, если бы вы назвали его полиморфными типами, это было бы яснее. – jalf

+0

@Norman Ramsey - Мне нравится, что вы вызвали чистоту, и я должен признать, что раньше я не слышал, что функциональное программирование олицетворяет полиморфизм. Я чувствую, что мой ответ подходит к мячу функционального программирования, но я нашел, что вы напишите информативный. Спасибо. –

35

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

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

  1. Lambda Исчисление
  2. функций высшего порядка
  3. неизменности
  4. Никаких побочных эффектов
+0

+1 для правильности, -1 для использования 4-буквенного слова, такого как «парадигма». (теперь мне нужно стирать клавиатуру ...) – Javier

+0

_paradigm_ - это два последовательных 4-буквенных слова. – Nosredna

+0

@Javier - Мой следующий вопрос: «Какие продукты вы используете, чтобы вымыть клавиатуру?» :) –

3

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

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

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

+0

На самом деле, FP намного больше, чем просто. –

14

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

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

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

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

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

+0

После этого, OO и Functional могут работать вместе. Некоторый функциональный язык (CAML или OCAML, чтобы быть конкретным) вытягивать концепции OO, а некоторые языки OO (например, D и даже C#) используют функциональные концепции. Я бы сказал, что «объекты» довольно явны для идеи программирования OO. ;) – CodexArcanum

+2

Тогда у вас есть только проблема определения того, что такое «объект», и как он отличается от вещей, которые не являются объектами. Удачи. – Apocalisp

3

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

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

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

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

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

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

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

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

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