Определение точки функционального программирования - PullRequest
20 голосов
/ 18 октября 2008

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

Ответы [ 8 ]

20 голосов
/ 18 октября 2008

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

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

12 голосов
/ 18 октября 2008

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

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

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

8 голосов
/ 18 октября 2008

Из Википедия :

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

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

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

Здесь есть отличная статья с более подробной информацией здесь .

7 голосов
/ 18 октября 2008

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

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

Особенности FP:

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

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

3 голосов
/ 18 октября 2008

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

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

1 голос
/ 08 августа 2010

Есть два отдельных определения:

  • Старое определение (первоклассные функции) было дано Крисом Конвеем.

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

Это источник большого замешательства ...

0 голосов
/ 18 октября 2008

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

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

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)

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

function incNormal(x) {
  return x + 1
}

function incTwo(x) {
  return x + 2
}

AggregateItemsInList(List, +, incNormal)

Хотите сделать любой другой предмет?

AggegateItemsInList(List, +, incTwo)

Хотите умножить?

AggregateItemsInList(List, *, incNormal)

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

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

AggregateItemsInList(ListOfStudents, AddScores, incOne)

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

0 голосов
/ 18 октября 2008

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

Это применение функций, а не изменение состояния.

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