2008-10-18 3 views
20

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

+0

Возможно программировать в функциональном стиле на многих языках C#, C++, Python, Perl. Но есть также функциональные языки (LISP, ML и т. Д.). Я думаю, что из вашего вопроса нам нужно сосредоточиться на функциональных функциях повсюду, а не только на функциональных языках ... – Cervo 2008-10-18 15:13:06

+0

Это с фон Нейманом и лямбдой Церкви – vrdhn 2012-03-03 16:07:56

ответ

20

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

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

+0

Я добавлю, что вы можете сделать это на многих распространенных языках программирования, а не в ErLang/другие функциональные языки. Но в двух словах это определение. – Cervo 2008-10-18 15:14:55

+1

Неверный. Вы имеете в виду _pure_ FP. Есть случаи, когда FP не является побочным эффектом. Вы [объединяете таксономию FP против процедурного, с IP против DP] (http://stackoverflow.com/questions/602444/what-is-functional-declarative-and-imperative-programming/8357604#8357604). – 2011-12-08 01:09:08

-1

Это как рисование изображения с использованием векторов вместо растровых изображений - расскажите художнику, как изменить изображение, а не на то, как выглядит изображение на каждом шагу.

Это применение функций в отличие от изменения состояния.

8

wikipedia От:

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

Используя функциональный подход дает следующие преимущества:

  • Параллельное программирование намного проще в функциональных языках.
  • Функции в FP никогда не могут вызывать побочные эффекты - это упрощает модульное тестирование.
  • Развертывание горячего кода в производственных условиях намного проще.
  • Функциональные языки могут быть обоснованы математически.
  • Леновая оценка обеспечивает потенциал для оптимизации производительности.
  • Более выразительные - замыкания, сопоставление образцов, системы расширенного типа и т. Д. Позволяют программистам «легче сказать, что они означают».
  • Brevity - для некоторых классов программы функциональное решение значительно более кратким.

Существует отличная статья с подробностями here.

3

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

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

-1

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

Например, очень популярный функциональный вызов - это карта. Это в основном эквивалентно

list is some list of items 
OutList is some empty list 
foreach item in list 
    OutList.append(function(item)) 
return OutList 

так, что код выражается как карта (функция, список). Революционная концепция - это функция. Javascript - отличный пример языка с функциями высокого порядка. В основном функции могут обрабатываться как переменная и передаваться в функции или возвращаться из функций. C++ и C имеют указатели на функции, которые можно использовать аналогично. .NET делегаты также могут быть использованы аналогичным образом.

, то вы можете думать о всевозможных холодных абстракций ...

У вас есть функция AddItemsInList, MultiplyItemsInList, и т.д ..?
Каждая функция принимает (список) и возвращает единственный результат

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

AggregateItemsInList(List, combinefunction, StepFunction) 

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

function incNormal(x) { 
    return x + 1 
} 

function incTwo(x) { 
    return x + 2 
} 

AggregateItemsInList(List, +, incNormal) 

Want делать каждый другой предмет?

AggegateItemsInList(List, +, incTwo) 

Хотите размножаться?

AggregateItemsInList(List, *, incNormal) 

Хотите добавить баллы для экзамена вместе?

function AddScores (studenta, studentb) { 
    return studenta.score + studentb.score 
} 

AggregateItemsInList(ListOfStudents, AddScores, incOne) 

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

12

Многие определения до сих пор подчеркивали чистоту, но существует много языков, которые считаются функциональными, которые совсем не чисты (например, ML, Scheme). Я думаю, что ключевыми свойствами, которые делают язык «функциональными», являются:

  1. Функции более высокого порядка. Функции представляют собой встроенный тип данных, отличный от целых и булевых. Анонимные функции легко создавать и идиоматически (например, lambdas).
  2. Все это выражение. В императивных языках проводится различие между операторами, которые мутируют состояние и влияют на поток управления, и выражениями, которые дают значения. В функциональных языках (даже нечистых функциональных языках) оценка выражений является основной единицей исполнения.

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

7

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

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

функции FP:

  • Чистота (ака неизменность, сторонясь побочные эффекты, ссылочную прозрачность) функции
  • высшего порядка (например, передать функцию в качестве параметра, верните его в результате, определите анонимную функцию «на лету» как выражение лямбда)
  • Laziness (a.k.a. нестрогие оценка, наиболее полезным/полезной, когда в сочетании с чистотой)
  • Алгебраические типы данных и шаблону
  • Closures
  • выделки/частичное применение
  • Параметрический полиморфизм (aka generics)
  • Рекурсия (более заметным в результате чистоты)
  • Программирование с помощью выражений, а не заявления (опять-таки, от чистоты)
  • ...

Чем больше функций из выше список, который вы используете, тем более вероятно, что кто-то отметит, что вы делаете «функциональное программирование» (и первые две функции - чистота и функции более высокого порядка, вероятно, стоят самых дополнительных бонусных баллов по отношению к вашему «рейтингу FP») ,

1

Есть два отдельных определения: (функции первого класса)

  • Старшее определение было дано Крис Конвей.

  • Более новое определение (избегая побочных эффектов, таких как мутация) было дано Джоном Стауффером. Это более широко известно как чисто функциональное программирование.

Это источник большой путаницы ...