Применяются ли такие понятия, как Map и Reduce, ко всем языкам функционального программирования? - PullRequest
1 голос
/ 28 апреля 2009

Я только начал углубляться в мир функционального программирования.

Многие концепции ООП (объектно-ориентированного программирования), такие как наследование и полиморфизм, применимы к большинству современных языков ОО, таких как C #, Java и VB.NET.

Но как насчет таких понятий, как Map, Reduce, Tuples и Sets, они применимы ко всем языкам FP (функционального программирования)?

Я только начал с F #. Но применимы ли вышеупомянутые концепции к другим FP, таким как Haskell, Nemerle, Lisp и т. Д .?

Ответы [ 6 ]

6 голосов
/ 28 апреля 2009

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

Это немного сложно, но статья Джона Бэкуса Turing Award , в которой он описал функциональное (или «аппликативное») программирование, является хорошим чтением. Статья Википедии тоже хороша.

2 голосов
/ 30 апреля 2012

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

Как вы говорите, у ООП есть хорошо известные столпы (инкапсуляция, наследование, полиморфизм). Я бы сказал, что «столпами» функционального программирования являются: 1) использование функций в качестве первоклассных значений и 2) выражение себя без побочных эффектов.

Скорее всего, вы найдете общие инструменты для применения этих идей на разных языках FP (F # - отличный выбор, кстати!), И вы увидите, что они находят свой путь к более распространенным языкам; может быть в менее узнаваемой форме (например, LINQ's Select = map, Aggregate = Reduce / Fold, Where = filter, C # имеет облегченный лямбда-синтаксис, System.Tuple и т. д.).

Кроме того, вещь, которая, как правило, отсутствует в языках, не являющихся явно FP, - это хорошие неизменяемые структуры данных и поддержка синтаксиса для них (не просто библиотеки), что затрудняет соблюдение компонента №2 в тех языки. Списки F #, записи, кортежи и т. Д. Являются хорошими примерами отличной поддержки языка и библиотеки для этого.

2 голосов
/ 28 апреля 2009

Функциональные инструменты применяются ко всем программам, а не только к языкам, которые обрабатывают это явно. Например, в Python есть встроенные функции map и reduce, которые выполняют именно то, что вы ожидаете, помимо оценки не по порядку. вам понадобится что-то вроде многопроцессорного модуля, чтобы стать действительно умным.

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

2 голосов
/ 28 апреля 2009

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

1 голос
/ 28 апреля 2009

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

0 голосов
/ 28 апреля 2009

Они применяются ко всем языкам, которые содержат типы данных, которые могут быть «отображены» и «сокращены», то есть карты, массивы / векторы или списки.

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

...