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

Определение точки функционального программирования

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

От wikipedia:

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

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

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

Существует большая статья с более подробной информацией здесь.

Ответ 4

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

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

Функции FP:

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

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

Ответ 5

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

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

Ответ 6

Существует два разных определения:

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

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

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

Есть ли у вас функция AddItemsInList, MultiplyItemsInList и т.д.?

Каждая функция принимает (List) и возвращает единственный результат

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

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)

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