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

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

encapsulation inheritance, polymorphism

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

 Apocalisp11 июл. 2009 г., 05:41
Носредна, и ни один из них не имеет точного значения.
 Pavel Minaev11 июл. 2009 г., 05:09
Почему вы считаете, что это основные понятия ООП? Многие ОО-языки не имеют инкапсуляции (например, Python, CLOS). Некоторые ОО-языки не имеют наследования (например, Self, JavaScript и любой другой язык, основанный на прототипах), а некоторые имеют, но это не так уж и важно (практически любой динамический язык или любой другой язык с типизацией типа «утка»). Единственное, что действительно является общим для всех них, - это полиморфизм во время выполнения.
 Nosredna11 июл. 2009 г., 05:39
Из википедии: «Армстронг, Кварки объектно-ориентированного развития». В порядке убывания популярности «кварки» являются: наследование, объект, класс, инкапсуляция, метод, передача сообщений, полиморфизм, абстракция & quot;
 Javier11 июл. 2009 г., 05:41
@ Павел Минаев: +1; но я бы сказал, что инкапсуляция не обязательно означает конфиденциальность (частные члены), просто соединение состояния и процесса (методы перемещаются с объектом как единое целое). Если это так, инкапсуляция является общей для всех ООП, о которых я знаю, и, возможно, еще более «core». чем полиморфизм.
 Nosredna11 июл. 2009 г., 05:48
Согласовано. Нет точного значения. Я думаю, что инкапсуляция является наиболее важной идеей, связанной с ОО. Но это только я. Кварки из 40 лет литературы ОО. Я могу только поверить, что все эти люди писали оsomething.

Ответы на вопрос(5)

Решение Вопроса

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

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

Nested, first-class functions with proper lexical scoping are at the core. This means you can create an anonymous function at run time, whose free variables may be parameters or local variables of an enclosing function, and you get a value you can return, put into data structures, and so on. (This is the most important form of higher-order functions, but some higher-order functions (like qsort!) can be written in C, which is not a functional language.)

Means of composing functions with other functions to solve problems. Nobody does this better than John Hughes.

Many functional programmers believe purity (freedom from effects, including mutation, I/O, and exceptions) is at the core of functional programming. Many functional programmers do not.

Polymorphism, whether it is enforced by the compiler or not, is a core value of functional programmers. Confusingly, C++ programmers call this concept "generic programming." When polymorphism is enforced by the compiler it is generally a variant of Hindley-Milner, but the more powerful System F is also a powerful basis for functional languages. And with languages like Scheme, Erlang, and Lua, you can do functional programming without a static type system.

Finally, a large majority of functional programmers believe in the value of inductively defined data types, sometimes called "recursive types". In languages with static type systems these are generally known as "algebraic data types", but you will find inductively defined data types even in material written for beginning Scheme programmers. Inductively defined types usually ship with a language feature called pattern matching, which supports a very general form of case analysis. Often the compiler can tell you if you have forgotten a case. I wouldn't want to program without this language feature (a luxury once sampled becomes a necessity).

 11 июл. 2009 г., 16:29
@ Норман Рэмси - мне нравится, что ты говорил о чистоте, и должен признать, что раньше не слышал, чтобы в функциональном программировании был реализован полиморфизм. Я чувствую, что мой ответ доходит до сути функционального программирования, но я нашел ваше описание информативным. Спасибо.
 11 июл. 2009 г., 15:12
Я думаю, что полиморфизм вводит в заблуждение. Общее программирование на C ++ охватывает гораздо больше (обычно оно также использует метапрограммирование для включения нескольких различных реализаций, в зависимости от типа - то, о чем вы говорите, больше похоже на универсальные .NET, чем шаблоны C ++ / универсальное программирование). И эта форма параметрического типа полиморфизма имеет мало общего с тем, что программисты ООП называют полиморфизмом. Если бы вы назвали это полиморфными типами, это было бы более понятно, я думаю.

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

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

Lambda Calculus Higher Order Functions Immutability No side-effects
 11 июл. 2009 г., 09:24
Он ссылался на то, откуда он, и это хороший ответ. Однако я бы дал +1 к точечным точкам.
 11 июл. 2009 г., 06:39
9 голосов за цитирование Википедии ?! Какой мирis этот?
 11 июл. 2009 г., 06:06
Я предполагаю, что он использует SOAP.
 11 июл. 2009 г., 05:47
+1 для корректности, -1 для использования четырехбуквенного слова, такого как «парадигма». (теперь я должен помыть клавиатуру ...)
 11 июл. 2009 г., 19:10
@Magnus Skog - Чистые функциональные языки программирования не имеют побочных эффектов. Существуют языки, такие как Lisp и F #, которые являются мультипарадигмами, которые могут в основном основываться на концепциях функционального программирования, но нарушают некоторые правила. Примером чисто функционального языка является Haskell.

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

Инкапсуляция, в более общем смысле, является модульностью. Все чисто функциональные языки, которые я знаю о поддержкеmodular programming, Вы могли бы сказать, что эти языки реализуют инкапсуляцию лучше, чем типичный "OO" разнообразие, так как побочные эффекты нарушают инкапсуляцию, иpure functions have no side-effects.

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

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

То, что я пытаюсь сказать, - это то, что ваши "основные понятия ОО" никак не связаны с ОО. Я бы, например, утверждал, что нетany Основные понятия ОО, на самом деле.

 24 сент. 2009 г., 04:37
Тогда у вас просто возникает проблема с определением, что такое "объект" это именно то, и чем оно отличается от вещей, которые не являются объектами. Удачи.
 24 сент. 2009 г., 00:18
После этого OO и Functional могут работать вместе. Некоторые функциональные языки (в частности, CAML или OCAML) используют концепции ОО, а некоторые языки ОО (например, D и даже C #) используют функциональные концепции. Я бы сказал, что «Объекты» довольно ядро для идеи ОО программирования, хотя. ;)

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

Функциональная программа состоит только из функций. Функции вычисляют значения из их входов. Мы можем противопоставить это императиву программирование, где по мере выполнения программы значения изменяемых места меняются. Другими словами, в 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

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

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

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

 11 июл. 2009 г., 05:06
Не совсем, FP гораздо больше, чем просто.

Ваш ответ на вопрос