Википедия

Функциональное программирование

Функциона́льное программи́рование — парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).

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

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

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

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

Языки функционального программирования

Наиболее известными языками функционального программирования являются:

  • Лисп (Джон Маккарти, 1958) и множество его диалектов, наиболее известные — Scheme, Clojure и Common Lisp; в 1970-е годы для поддержки языка создавались специализированные аппаратные комплексы — лисп-машины;
  • Erlang (Джо Армстронг, 1986) — функциональный язык с поддержкой процессов, а также его прямой потомок Elixir;
  • APL — предшественник современных научных вычислительных сред, таких как MATLAB;
  • ML (Робин Милнер, 1979) и его основные диалекты Standard ML и OCaml;
  • F# — функциональный язык семейства ML для платформы .NET;
  • Scala — язык платформы JVM, сочетающий возможности функционального и объектно-ориентированного программирования;
  • Miranda (Дэвид Тёрнер, 1985) и его прямой потомок чистый функциональный язык Haskell;
  • Nemerle — гибридный функционально-императивный язык.

Ещё не полностью функциональные изначальные версии и Лиспа, и APL внесли особый вклад в создание и развитие функционального программирования. Более поздние версии Lisp, такие как Scheme, а также различные варианты APL поддерживали все свойства и концепции функционального языка.

Как правило, интерес к функциональным языкам программирования, особенно чисто функциональным, был скорее научный, нежели коммерческий. Однако, такие примечательные языки как Erlang, OCaml, Haskell, Scheme (после 1986) а также специфические R (статистика), Wolfram (символьная математика), J и K (финансовый анализ), и XSLT (XML) находили применение в индустрии коммерческого программирования. Такие широко распространённые декларативные языки как SQL и Lex/Yacc содержат некоторые элементы функционального программирования, например, не используют переменных. Языки работы с электронными таблицами также можно рассматривать как функциональные, потому что в ячейках электронных таблиц задаётся массив функций, как правило зависящих лишь от других ячеек, а при желании смоделировать переменные приходится прибегать к возможностям императивного языка макросов.

История

Лямбда-исчисление стало теоретической базой для описания и вычисления функций. Являясь математической абстракцией, а не языком программирования, оно составило базис почти всех языков функционального программирования на сегодняшний день. Сходное теоретическое понятие, комбинаторная логика, является более абстрактным, нежели λ-исчисления и было создано раньше. Эта логика используется в некоторых эзотерических языках, например в Unlambda. И λ-исчисление, и комбинаторная логика были разработаны для более ясного и точного описания принципов и основ математики.

Первым функциональным языком был Лисп, созданный Джоном Маккарти в период его работы в Массачусетском технологическом институте в конце пятидесятых и реализованный, первоначально, для IBM 700/7000. В Лиспе впервые введено множество понятий функционального языка, хотя при этом в языке применяется не только парадигма функционального программирования. Дальнейшим развитием Лиспа стали такие языки как Scheme и Dylan.

Язык обработки информации ([англ.], IPL) иногда определяется как самый первый машинный функциональный язык. Это язык ассемблерного типа для работы со списком символов. В нём было понятие «генератора», который использовал функцию в качестве аргумента, а также, поскольку это язык ассемблерного уровня, он может позиционироваться как язык, имеющий функции высшего порядка. Однако, в целом IPL акцентирован на использование императивных понятий.

Кеннет Айверсон разработал язык APL в начале шестидесятых, документировав его в своей книге A Programming Language (ISBN 978-0-471-43014-8). APL оказал значительное влияние на язык [англ.], созданный Джоном Бэкусом. В начале девяностых Айверсон и [англ.] создали преемника APL — язык программирования J. В середине девяностых [англ.], ранее работавший с Айверсоном, создал язык K, который впоследствии использовался в финансовой индустрии на коммерческой основе.

В 1970-х годах в университете Эдинбурга Робин Милнер создал язык ML, а Дэвид Тернер начинал разработку языка SASL в университете Сент-Эндрюса и, впоследствии, язык Miranda в университете города Кент. В конечном итоге на основе ML были созданы несколько языков, среди которых наиболее известные Objective Caml и Standard ML. Также в семидесятых осуществлялась разработка языка программирования, построенного по принципу Scheme (реализация не только функциональной парадигмы), получившего описание в известной работе «Lambda Papers», а также в книге восемьдесят пятого года «Structure and Interpretation of Computer Programs».

В 1972 году Пер Мартин-Лёф создал интуиционистскую теорию типов (также называемую конструктивной). В этой теории функциональное программирование получило конструктивное доказательство того, что ранее было известно как зависимый тип. Это дало мощный толчок к развитию диалогового доказательства теорем и к последующему созданию множества функциональных языков.

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

Концепции

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

Функции высших порядков

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

Функции высших порядков позволяют использовать карринг — преобразование функции от пары аргументов в функцию, берущую свои аргументы по одному. Это преобразование получило своё название в честь Хаскелла Карри.

Чистые функции

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

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

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

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

Рекурсия

В функциональных языках цикл обычно реализуется в виде рекурсии. Строго говоря, в функциональной парадигме программирования нет такого понятия, как цикл. Рекурсивные функции вызывают сами себя, позволяя операции выполняться снова и снова. Для использования рекурсии может потребоваться большой стек, но этого можно избежать в случае хвостовой рекурсии. Хвостовая рекурсия может быть распознана и оптимизирована компилятором в код, получаемый после компиляции аналогичной итерации в императивном языке программирования. Стандарты языка Scheme требуют распознавать и оптимизировать хвостовую рекурсию. Оптимизировать хвостовую рекурсию можно путём преобразования программы в стиле использования продолжений при её компиляции, как один из способов.

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

Подход к вычислению аргументов

Функциональные языки можно классифицировать по тому, как обрабатываются аргументы функции в процессе её вычисления. Технически различие заключается в выражения. К примеру, при строгом подходе к вычислению выражения:

print(len([2+1, 3*2, 1/0, 5-4])) 

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

Как правило, нестрогий подход реализуется в виде редукции графа. Нестрогое вычисление используется по умолчанию в нескольких чисто функциональных языках, в том числе Miranda и Haskell.

В нефункциональных языках

Принципиально нет препятствий для написания программ в функциональном стиле на языках, которые традиционно не считаются функциональными, точно так же, как программы в объектно-ориентированном стиле можно писать на структурных языках. Некоторые императивные языки поддерживают типичные для функциональных языков конструкции, такие как функции высшего порядка и списковые включения (list comprehensions), что облегчает использование функционального стиля в этих языках, в частности, такой подход широко применяется в практике языка Python. Другим примером является язык Ruby, который имеет возможность создания как анонимных функций с использованием связанных переменных (λ-объектов), так и возможность организации анонимных функций высшего порядка через блок с помощью конструкции yield. В языке Си указатели на функцию в качестве типов аргументов могут быть использованы для создания функций высшего порядка. Функции высшего порядка и отложенная списковая структура реализованы в библиотеках C++. В языках Java версии 8 и выше и в C# версии 3.0 и выше можно использовать λ-функции для написания программы в функциональном стиле.

Стили программирования

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

# императивный стиль target = [] # создать пустой список for item in source_list: # для каждого элемента исходного списка trans1 = G(item) # применить функцию G() trans2 = F(trans1) # применить функцию F() target.append(trans2) # добавить преобразованный элемент в список 

Функциональная версия выглядит по-другому:

# функциональный стиль # языки ФП часто имеют встроенную функцию compose() compose2 = lambda A, B: lambda x: A(B(x)) target = map(compose2(F, G), source_list) 

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

Более точно, существует четыре ступени развития функционального стиля, в порядке убывания роли данных в программах[источник не указан 766 дней]:

  • Рефал (для этой категории, представленной единственным языком[источник не указан 766 дней], нет общепринятого названия);
  • Аппликативные (Лисп, ML, Tcl, Rebol);
  • Комбинаторные (APL/J/K, [англ.]/[англ.]);
  • Бесточечные (чистые конкатенативные) (Joy, Cat, Factor, подмножество PostScript).

В первом случае вся структура программы определяется структурой данных, в последнем — данные как таковые вообще отсутствуют в исходном коде, они лишь подразумеваются на входе. Некоторые языки поддерживают ряд стилей: например, Haskell позволяет писать и в аппликативном, и в комбинаторном, и в бесточечном стилях.

Особенности

Основной особенностью функционального программирования, определяющей как преимущества, так и недостатки данной парадигмы, является то, что в ней реализуется модель вычислений без состояний. Если императивная программа на любом этапе исполнения имеет состояние, то есть совокупность значений всех переменных, и производит побочные эффекты, то чисто функциональная программа ни целиком, ни частями состояния не имеет и побочных эффектов не производит. То, что в императивных языках делается путём присваивания значений переменным, в функциональных достигается путём передачи выражений в параметры функций. Непосредственным следствием становится то, что чисто функциональная программа не может изменять уже имеющиеся у неё данные, а может лишь порождать новые путём копирования или расширения старых. Следствием того же является отказ от циклов в пользу рекурсии.

Сильные стороны

Повышение надёжности кода

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

Удобство организации модульного тестирования

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

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

Возможности оптимизации при компиляции

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

Возможности параллелизма

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

Недостатки

Недостатки функционального программирования вытекают из тех же самых его особенностей. Отсутствие присваиваний и замена их на порождение новых данных приводят к необходимости постоянного выделения и автоматического освобождения памяти, поэтому в системе исполнения функциональной программы обязательным[источник не указан 1627 дней] компонентом становится высокоэффективный сборщик мусора. Нестрогая модель вычислений приводит к непредсказуемому порядку вызова функций, что создаёт проблемы при вводе-выводе, где порядок выполнения операций важен. Кроме того, очевидно, функции ввода в своём естественном виде (например, getchar() из стандартной библиотеки языка Си) не являются чистыми, поскольку способны возвращать различные значения для одних и тех же аргументов, и для устранения этого требуются определённые ухищрения.

Для преодоления недостатков функциональных программ уже первые языки функционального программирования включали не только чисто функциональные средства, но и механизмы императивного программирования (присваивание, цикл, «неявный PROGN» были уже в Лиспе). Использование таких средств позволяет решить некоторые практические проблемы, но означает отход от идей (и преимуществ) функционального программирования и написание императивных программ на функциональных языках. В чистых функциональных языках эти проблемы решаются другими средствами, например, в языке Haskell ввод-вывод реализован при помощи монад — концепции, позаимствованной из теории категорий.

Примечания

  1. А. Филд, П. Харрисон Функциональное программирование: Пер. с англ. — М.: Мир, 1993. — 637 с, ил. ISBN 5-03-001870-0. Стр. 120 [Глава 6: Математические основы: λ-исчисление].
  2. Tiobe Programming Community Index. Дата обращения: 24 сентября 2011. Архивировано 2 июля 2013 года.
  3. [англ.]. Conception, evolution, and application of functional programming languages (англ.) // Association for Computing Machinery Computing Surveys : journal. — 1989. — September (vol. 21, no. 3). — P. 359—411. — doi:10.1145/72551.72554. Архивировано 5 июня 2013 года.
  4. Роджер Пенроуз. Глава 2: Лямбда-исчисление Черча // Новый ум короля. О компьютерах, мышлении и законах физики = The Emperors New Mind: Concerning Computers, Minds and The Laws of Physics. — Едиториал УРСС, 2003. — ISBN 5-354-00005-X. + переиздание ISBN 978-5-382-01266-7; 2011 г.
  5. [англ.]. History of Lisp // In Association for Computing Machinery SIGPLAN History of Programming Languages Conference. — 1978. — Июнь. — С. 217—223. — doi:10.1145/800025.808387. Архивировано 7 июня 2008 года.
  6. J. Harrison, 1997, Гл. 3. λ-исчисление как язык программирования.
  7. В своих мемуарах Герберт Саймон (1991), Models of My Life pp.189-190 ISBN 0-465-04640-1 утверждает, что его, Al. Ньюэлл, и Клифф Шоу которых «часто называют родителями искусственного интеллекта» за написание программы [англ.] автоматически доказывающей теоремы из Principia Mathematica. Для того, чтобы достичь этого, они должны были придумать язык и парадигму, которую, ретроспективно, можно рассматривать как функциональное программирование.
  8. History of Programming Languages: IPL. Дата обращения: 15 апреля 2012. Архивировано из оригинала 1 ноября 2006 года.
  9. XIV. APL Session // History of Programming Language / Richard L. Wexelbblat. — Academic Press, 1981. — С. 661—693. — 749 с. — ISBN 0-12-745040-8.
  10. Евгений Кирпичёв. Элементы функциональных языков // Практика функционального программирования. — 2009. — Декабрь (вып. 3). — ISSN 2075-8456. Архивировано 3 сентября 2017 года.
  11. Скачать PDF: «Техники функционального программирования, В. А. Потапенко» стр. 8 «Функции высших порядков». Дата обращения: 10 января 2009. Архивировано 30 июня 2009 года.
  12. GCC, Declaring Attributes of Functions. Дата обращения: 28 августа 2012. Архивировано 18 августа 2012 года.
  13. XL Fortran for AIX, V13.1 > Language Reference, Pure procedures (Fortran 95)
  14. Tail call optimization. Дата обращения: 31 июля 2012. Архивировано 1 августа 2012 года.
  15. Revised5 Report on the Algorithmic Language Scheme, 3.5. Proper tail recursion. Дата обращения: 31 июля 2012. Архивировано 5 января 2007 года.
  16. ; Fokkinga, Maarten; Paterson, Ross (1991). Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire (PDF). Conference on Functional Programming Languages and Computer Architecture (FPCA). Springer. pp. 124–144. CiteSeerX 10.1.1.41.125. ISBN 3-540-54396-1. Архивировано (PDF) 9 июля 2017. Дата обращения: 3 марта 2020.
  17. Bird, Richard. Pearls of Functional Algorithm Design (англ.). — Cambrigde: University Press, 2010. — 277 p. — ISBN 978-0-521-51338-8. Архивировано 8 марта 2022 года.
  18. Н. А. Роганова Функциональное программирование: Учебное пособие для студентов высших учебных заведений — М.: ГИНФО, 2002. — 260 с. Стр. 14 п. 3.1. Ленивые и энергичные вычисления
  19. Lazy Evaluation - an overview | ScienceDirect Topics. www.sciencedirect.com. Дата обращения: 23 марта 2021.
  20. Ахмечет В. «Функциональное программирование для всех». Дата обращения: 11 января 2009. Архивировано 2 февраля 2009 года.

Литература

  • Городняя Л. В. Основы функционального программирования. Курс лекций — М.: Интернет-университет информационных технологий, 2004. С. 280. ISBN 5-9556-0008-6
  • Душкин Р. В. Функциональное программирование на языке Haskell. — М.: ДМК Пресс, 2006. С. 608. ISBN 5-94074-335-8
  • Филд А., Харрисон П. Функциональное программирование = Functional Programming. — М.: Мир, 1993. — 637 с. — ISBN 5-03-001870-0.
  • Н. А. Роганова Функциональное программирование: Учебное пособие для студентов высших учебных заведений — М.: ГИНФО, 2002. — 260 с.
  • John Harrison. Функциональное программирование. Курс лекций = Functional Programming. — 1997.
  • А. М. Миронов. Теория функциональных программ.

Ссылки

  • Журнал «Практика функционального программирования» (выпускался в 2009—2011 годы)

Википедия, чтение, книга, библиотека, поиск, нажмите, истории, книги, статьи, wikipedia, учить, информация, история, скачать, скачать бесплатно, mp3, видео, mp4, 3gp, jpg, jpeg, gif, png, картинка, музыка, песня, фильм, игра, игры, мобильный, телефон, Android, iOS, apple, мобильный телефон, Samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Сеть, компьютер, Информация о Функциональное программирование, Что такое Функциональное программирование? Что означает Функциональное программирование?

Funkciona lnoe programmi rovanie paradigma programmirovaniya v kotoroj process vychisleniya traktuetsya kak vychislenie znachenij funkcij v matematicheskom ponimanii poslednih v otlichie ot funkcij kak podprogramm v procedurnom programmirovanii Protivopostavlyaetsya paradigme imperativnogo programmirovaniya kotoraya opisyvaet process vychislenij kak posledovatelnoe izmenenie sostoyanij v znachenii podobnom takovomu v teorii avtomatov Pri neobhodimosti v funkcionalnom programmirovanii vsya sovokupnost posledovatelnyh sostoyanij vychislitelnogo processa predstavlyaetsya yavnym obrazom naprimer kak spisok Funkcionalnoe programmirovanie predpolagaet obhoditsya vychisleniem rezultatov funkcij ot ishodnyh dannyh i rezultatov drugih funkcij i ne predpolagaet yavnogo hraneniya sostoyaniya programmy Sootvetstvenno ne predpolagaet ono i izmenyaemost etogo sostoyaniya v otlichie ot imperativnogo gde odnoj iz bazovyh koncepcij yavlyaetsya peremennaya hranyashaya svoyo znachenie i pozvolyayushaya menyat ego po mere vypolneniya algoritma Na praktike otlichie matematicheskoj funkcii ot ponyatiya funkcii v imperativnom programmirovanii zaklyuchaetsya v tom chto imperativnye funkcii mogut opiratsya ne tolko na argumenty no i na sostoyanie vneshnih po otnosheniyu k funkcii peremennyh a takzhe imet pobochnye effekty i menyat sostoyanie vneshnih peremennyh Takim obrazom v imperativnom programmirovanii pri vyzove odnoj i toj zhe funkcii s odinakovymi parametrami no na raznyh etapah vypolneniya algoritma mozhno poluchit raznye dannye na vyhode iz za vliyaniya na funkciyu sostoyaniya peremennyh A v funkcionalnom yazyke pri vyzove funkcii s odnimi i temi zhe argumentami my vsegda poluchim odinakovyj rezultat vyhodnye dannye zavisyat tolko ot vhodnyh Eto pozvolyaet sredam vypolneniya programm na funkcionalnyh yazykah keshirovat rezultaty funkcij i vyzyvat ih v poryadke ne opredelyaemom algoritmom i rasparallelivat ih bez kakih libo dopolnitelnyh dejstvij so storony programmista chto obespechivayut funkcii bez pobochnyh effektov chistye funkcii Lyambda ischislenie yavlyaetsya osnovoj dlya funkcionalnogo programmirovaniya mnogie funkcionalnye yazyki mozhno rassmatrivat kak nadstrojku nad nim Yazyki funkcionalnogo programmirovaniyaNaibolee izvestnymi yazykami funkcionalnogo programmirovaniya yavlyayutsya Lisp Dzhon Makkarti 1958 i mnozhestvo ego dialektov naibolee izvestnye Scheme Clojure i Common Lisp v 1970 e gody dlya podderzhki yazyka sozdavalis specializirovannye apparatnye kompleksy lisp mashiny Erlang Dzho Armstrong 1986 funkcionalnyj yazyk s podderzhkoj processov a takzhe ego pryamoj potomok Elixir APL predshestvennik sovremennyh nauchnyh vychislitelnyh sred takih kak MATLAB ML Robin Milner 1979 i ego osnovnye dialekty Standard ML i OCaml F funkcionalnyj yazyk semejstva ML dlya platformy NET Scala yazyk platformy JVM sochetayushij vozmozhnosti funkcionalnogo i obektno orientirovannogo programmirovaniya Miranda Devid Tyorner 1985 i ego pryamoj potomok chistyj funkcionalnyj yazyk Haskell Nemerle gibridnyj funkcionalno imperativnyj yazyk Eshyo ne polnostyu funkcionalnye iznachalnye versii i Lispa i APL vnesli osobyj vklad v sozdanie i razvitie funkcionalnogo programmirovaniya Bolee pozdnie versii Lisp takie kak Scheme a takzhe razlichnye varianty APL podderzhivali vse svojstva i koncepcii funkcionalnogo yazyka Kak pravilo interes k funkcionalnym yazykam programmirovaniya osobenno chisto funkcionalnym byl skoree nauchnyj nezheli kommercheskij Odnako takie primechatelnye yazyki kak Erlang OCaml Haskell Scheme posle 1986 a takzhe specificheskie R statistika Wolfram simvolnaya matematika J i K finansovyj analiz i XSLT XML nahodili primenenie v industrii kommercheskogo programmirovaniya Takie shiroko rasprostranyonnye deklarativnye yazyki kak SQL i Lex Yacc soderzhat nekotorye elementy funkcionalnogo programmirovaniya naprimer ne ispolzuyut peremennyh Yazyki raboty s elektronnymi tablicami takzhe mozhno rassmatrivat kak funkcionalnye potomu chto v yachejkah elektronnyh tablic zadayotsya massiv funkcij kak pravilo zavisyashih lish ot drugih yacheek a pri zhelanii smodelirovat peremennye prihoditsya pribegat k vozmozhnostyam imperativnogo yazyka makrosov IstoriyaLyambda ischislenie stalo teoreticheskoj bazoj dlya opisaniya i vychisleniya funkcij Yavlyayas matematicheskoj abstrakciej a ne yazykom programmirovaniya ono sostavilo bazis pochti vseh yazykov funkcionalnogo programmirovaniya na segodnyashnij den Shodnoe teoreticheskoe ponyatie kombinatornaya logika yavlyaetsya bolee abstraktnym nezheli l ischisleniya i bylo sozdano ranshe Eta logika ispolzuetsya v nekotoryh ezotericheskih yazykah naprimer v Unlambda I l ischislenie i kombinatornaya logika byli razrabotany dlya bolee yasnogo i tochnogo opisaniya principov i osnov matematiki Pervym funkcionalnym yazykom byl Lisp sozdannyj Dzhonom Makkarti v period ego raboty v Massachusetskom tehnologicheskom institute v konce pyatidesyatyh i realizovannyj pervonachalno dlya IBM 700 7000 V Lispe vpervye vvedeno mnozhestvo ponyatij funkcionalnogo yazyka hotya pri etom v yazyke primenyaetsya ne tolko paradigma funkcionalnogo programmirovaniya Dalnejshim razvitiem Lispa stali takie yazyki kak Scheme i Dylan Yazyk obrabotki informacii angl IPL inogda opredelyaetsya kak samyj pervyj mashinnyj funkcionalnyj yazyk Eto yazyk assemblernogo tipa dlya raboty so spiskom simvolov V nyom bylo ponyatie generatora kotoryj ispolzoval funkciyu v kachestve argumenta a takzhe poskolku eto yazyk assemblernogo urovnya on mozhet pozicionirovatsya kak yazyk imeyushij funkcii vysshego poryadka Odnako v celom IPL akcentirovan na ispolzovanie imperativnyh ponyatij Kennet Ajverson razrabotal yazyk APL v nachale shestidesyatyh dokumentirovav ego v svoej knige A Programming Language ISBN 978 0 471 43014 8 APL okazal znachitelnoe vliyanie na yazyk angl sozdannyj Dzhonom Bekusom V nachale devyanostyh Ajverson i angl sozdali preemnika APL yazyk programmirovaniya J V seredine devyanostyh angl ranee rabotavshij s Ajversonom sozdal yazyk K kotoryj vposledstvii ispolzovalsya v finansovoj industrii na kommercheskoj osnove V 1970 h godah v universitete Edinburga Robin Milner sozdal yazyk ML a Devid Terner nachinal razrabotku yazyka SASL v universitete Sent Endryusa i vposledstvii yazyk Miranda v universitete goroda Kent V konechnom itoge na osnove ML byli sozdany neskolko yazykov sredi kotoryh naibolee izvestnye Objective Caml i Standard ML Takzhe v semidesyatyh osushestvlyalas razrabotka yazyka programmirovaniya postroennogo po principu Scheme realizaciya ne tolko funkcionalnoj paradigmy poluchivshego opisanie v izvestnoj rabote Lambda Papers a takzhe v knige vosemdesyat pyatogo goda Structure and Interpretation of Computer Programs V 1972 godu Per Martin Lyof sozdal intuicionistskuyu teoriyu tipov takzhe nazyvaemuyu konstruktivnoj V etoj teorii funkcionalnoe programmirovanie poluchilo konstruktivnoe dokazatelstvo togo chto ranee bylo izvestno kak zavisimyj tip Eto dalo moshnyj tolchok k razvitiyu dialogovogo dokazatelstva teorem i k posleduyushemu sozdaniyu mnozhestva funkcionalnyh yazykov Haskell byl sozdan v konce 1980 h godov v popytke soedinit mnozhestvo idej poluchennyh v hode issledovaniya funkcionalnogo programmirovaniya KoncepciiNekotorye koncepcii i paradigmy specifichny dlya funkcionalnogo programmirovaniya i v osnovnom chuzhdy imperativnomu programmirovaniyu vklyuchaya obektno orientirovannoe programmirovanie Tem ne menee yazyki programmirovaniya obychno predstavlyayut soboj gibrid neskolkih paradigm programmirovaniya poetomu bolshej chastyu imperativnye yazyki programmirovaniya mogut ispolzovat kakie libo iz etih koncepcij Funkcii vysshih poryadkov Osnovnaya statya Funkciya vysshego poryadka Funkcii vysshih poryadkov eto takie funkcii kotorye mogut prinimat v kachestve argumentov i vozvrashat drugie funkcii Matematiki takuyu funkciyu chashe nazyvayut operatorom naprimer operator vzyatiya proizvodnoj ili operator integrirovaniya Funkcii vysshih poryadkov pozvolyayut ispolzovat karring preobrazovanie funkcii ot pary argumentov v funkciyu berushuyu svoi argumenty po odnomu Eto preobrazovanie poluchilo svoyo nazvanie v chest Haskella Karri Chistye funkcii Chistymi nazyvayut funkcii kotorye ne imeyut pobochnyh effektov vvoda vyvoda i pamyati oni zavisyat tolko ot svoih parametrov i vozvrashayut tolko svoj rezultat Chistye funkcii obladayut neskolkimi poleznymi svojstvami mnogie iz kotoryh mozhno ispolzovat dlya optimizacii koda esli rezultat chistoj funkcii ne ispolzuetsya eyo vyzov mozhet byt udalyon bez vreda dlya drugih vyrazhenij rezultat vyzova chistoj funkcii mozhet byt memoizirovan to est sohranyon v tablice znachenij vmeste s argumentami vyzova esli net nikakoj zavisimosti po dannym mezhdu dvumya chistymi funkciyami to poryadok ih vychisleniya mozhno pomenyat ili rasparallelit govorya inache vychislenie chistyh funkcij udovletvoryaet principam potokobezopasnosti esli ves yazyk ne dopuskaet pobochnyh effektov to mozhno ispolzovat lyubuyu politiku vychisleniya Eto predostavlyaet svobodu kompilyatoru kombinirovat i reorganizovyvat vychislenie vyrazhenij v programme naprimer isklyuchit drevovidnye struktury Blagodarya memoizacii esli v dalnejshem funkciya vyzyvaetsya s etimi zhe argumentami eyo rezultat mozhet byt vzyat pryamo iz tablicy znachenij ne vychislyayas inogda eto nazyvaetsya principom prozrachnosti ssylok Memoizaciya cenoj nebolshogo rashoda pamyati pozvolyaet sushestvenno uvelichit proizvoditelnost i umenshit poryadok rosta nekotoryh rekursivnyh algoritmov Hotya bolshinstvo kompilyatorov imperativnyh yazykov programmirovaniya raspoznayut chistye funkcii i udalyayut obshie podvyrazheniya dlya vyzovov chistyh funkcij oni ne mogut delat eto vsegda dlya predvaritelno skompilirovannyh bibliotek kotorye kak pravilo ne predostavlyayut etu informaciyu Nekotorye kompilyatory takie kak gcc v celyah optimizacii predostavlyayut programmistu klyuchevye slova dlya oboznacheniya chistyh funkcij Fortran 95 pozvolyaet oboznachat funkcii kak pure chistye Rekursiya Osnovnaya statya Rekursiya V funkcionalnyh yazykah cikl obychno realizuetsya v vide rekursii Strogo govorya v funkcionalnoj paradigme programmirovaniya net takogo ponyatiya kak cikl Rekursivnye funkcii vyzyvayut sami sebya pozvolyaya operacii vypolnyatsya snova i snova Dlya ispolzovaniya rekursii mozhet potrebovatsya bolshoj stek no etogo mozhno izbezhat v sluchae hvostovoj rekursii Hvostovaya rekursiya mozhet byt raspoznana i optimizirovana kompilyatorom v kod poluchaemyj posle kompilyacii analogichnoj iteracii v imperativnom yazyke programmirovaniya Standarty yazyka Scheme trebuyut raspoznavat i optimizirovat hvostovuyu rekursiyu Optimizirovat hvostovuyu rekursiyu mozhno putyom preobrazovaniya programmy v stile ispolzovaniya prodolzhenij pri eyo kompilyacii kak odin iz sposobov Rekursivnye funkcii mozhno obobshit s pomoshyu funkcij vysshih poryadkov ispolzuya naprimer i ili svyortka i razvyortka Funkcii takogo roda igrayut rol takogo ponyatiya kak cikl v imperativnyh yazykah programmirovaniya Podhod k vychisleniyu argumentov Funkcionalnye yazyki mozhno klassificirovat po tomu kak obrabatyvayutsya argumenty funkcii v processe eyo vychisleniya Tehnicheski razlichie zaklyuchaetsya v vyrazheniya K primeru pri strogom podhode k vychisleniyu vyrazheniya print len 2 1 3 2 1 0 5 4 na vyhode budet oshibka tak kak v tretem elemente spiska prisutstvuet delenie na nol Pri nestrogom podhode znacheniem vyrazheniya budet 4 poskolku dlya vychisleniya dliny spiska znacheniya ego elementov strogo govorya ne vazhny i mogut voobshe ne vychislyatsya Pri strogom applikativnom poryadke vychisleniya zaranee podschityvayutsya znacheniya vseh argumentov pered vychisleniem samoj funkcii Pri nestrogom podhode normalnyj poryadok vychisleniya znacheniya argumentov ne vychislyayutsya do teh por poka ih znachenie ne ponadobitsya pri vychislenii funkcii Kak pravilo nestrogij podhod realizuetsya v vide redukcii grafa Nestrogoe vychislenie ispolzuetsya po umolchaniyu v neskolkih chisto funkcionalnyh yazykah v tom chisle Miranda i Haskell V nefunkcionalnyh yazykah Principialno net prepyatstvij dlya napisaniya programm v funkcionalnom stile na yazykah kotorye tradicionno ne schitayutsya funkcionalnymi tochno tak zhe kak programmy v obektno orientirovannom stile mozhno pisat na strukturnyh yazykah Nekotorye imperativnye yazyki podderzhivayut tipichnye dlya funkcionalnyh yazykov konstrukcii takie kak funkcii vysshego poryadka i spiskovye vklyucheniya list comprehensions chto oblegchaet ispolzovanie funkcionalnogo stilya v etih yazykah v chastnosti takoj podhod shiroko primenyaetsya v praktike yazyka Python Drugim primerom yavlyaetsya yazyk Ruby kotoryj imeet vozmozhnost sozdaniya kak anonimnyh funkcij s ispolzovaniem svyazannyh peremennyh l obektov tak i vozmozhnost organizacii anonimnyh funkcij vysshego poryadka cherez blok s pomoshyu konstrukcii yield V yazyke Si ukazateli na funkciyu v kachestve tipov argumentov mogut byt ispolzovany dlya sozdaniya funkcij vysshego poryadka Funkcii vysshego poryadka i otlozhennaya spiskovaya struktura realizovany v bibliotekah C V yazykah Java versii 8 i vyshe i v C versii 3 0 i vyshe mozhno ispolzovat l funkcii dlya napisaniya programmy v funkcionalnom stile Stili programmirovaniyaImperativnye programmy imeyut sklonnost akcentirovat posledovatelnosti shagov dlya vypolneniya kakogo to dejstviya a funkcionalnye programmy k raspolozheniyu i kompozicii funkcij chasto ne oboznachaya tochnoj posledovatelnosti shagov Prostoj primer dvuh reshenij odnoj zadachi ispolzuetsya odin i tot zhe yazyk Python illyustriruet eto imperativnyj stil target sozdat pustoj spisok for item in source list dlya kazhdogo elementa ishodnogo spiska trans1 G item primenit funkciyu G trans2 F trans1 primenit funkciyu F target append trans2 dobavit preobrazovannyj element v spisok Funkcionalnaya versiya vyglyadit po drugomu funkcionalnyj stil yazyki FP chasto imeyut vstroennuyu funkciyu compose compose2 lambda A B lambda x A B x target map compose2 F G source list V otlichie ot imperativnogo stilya opisyvayushego shagi vedushie k dostizheniyu celi funkcionalnyj stil opisyvaet matematicheskie otnosheniya mezhdu dannymi i celyu Bolee tochno sushestvuet chetyre stupeni razvitiya funkcionalnogo stilya v poryadke ubyvaniya roli dannyh v programmah istochnik ne ukazan 766 dnej Refal dlya etoj kategorii predstavlennoj edinstvennym yazykom istochnik ne ukazan 766 dnej net obsheprinyatogo nazvaniya Applikativnye Lisp ML Tcl Rebol Kombinatornye APL J K angl angl Bestochechnye chistye konkatenativnye Joy Cat Factor podmnozhestvo PostScript V pervom sluchae vsya struktura programmy opredelyaetsya strukturoj dannyh v poslednem dannye kak takovye voobshe otsutstvuyut v ishodnom kode oni lish podrazumevayutsya na vhode Nekotorye yazyki podderzhivayut ryad stilej naprimer Haskell pozvolyaet pisat i v applikativnom i v kombinatornom i v bestochechnom stilyah OsobennostiOsnovnoj osobennostyu funkcionalnogo programmirovaniya opredelyayushej kak preimushestva tak i nedostatki dannoj paradigmy yavlyaetsya to chto v nej realizuetsya model vychislenij bez sostoyanij Esli imperativnaya programma na lyubom etape ispolneniya imeet sostoyanie to est sovokupnost znachenij vseh peremennyh i proizvodit pobochnye effekty to chisto funkcionalnaya programma ni celikom ni chastyami sostoyaniya ne imeet i pobochnyh effektov ne proizvodit To chto v imperativnyh yazykah delaetsya putyom prisvaivaniya znachenij peremennym v funkcionalnyh dostigaetsya putyom peredachi vyrazhenij v parametry funkcij Neposredstvennym sledstviem stanovitsya to chto chisto funkcionalnaya programma ne mozhet izmenyat uzhe imeyushiesya u neyo dannye a mozhet lish porozhdat novye putyom kopirovaniya ili rasshireniya staryh Sledstviem togo zhe yavlyaetsya otkaz ot ciklov v polzu rekursii Silnye storony Povyshenie nadyozhnosti koda Privlekatelnaya storona vychislenij bez sostoyanij povyshenie nadyozhnosti koda za schyot chyotkoj strukturizacii i otsutstviya neobhodimosti otslezhivaniya pobochnyh effektov Lyubaya funkciya rabotaet tolko s lokalnymi dannymi i rabotaet s nimi vsegda odinakovo nezavisimo ot togo gde kak i pri kakih obstoyatelstvah ona vyzyvaetsya Nevozmozhnost mutacii dannyh pri polzovanii imi v raznyh mestah programmy isklyuchaet poyavlenie trudnoobnaruzhivaemyh oshibok takih naprimer kak sluchajnoe prisvaivanie nevernogo znacheniya globalnoj peremennoj v imperativnoj programme Udobstvo organizacii modulnogo testirovaniya Poskolku funkciya v funkcionalnom programmirovanii ne mozhet porozhdat pobochnye effekty menyat obekty nelzya kak vnutri oblasti vidimosti tak i snaruzhi v otlichie ot imperativnyh programm gde odna funkciya mozhet ustanovit kakuyu nibud vneshnyuyu peremennuyu schityvaemuyu vtoroj funkciej Edinstvennym effektom ot vychisleniya funkcii yavlyaetsya vozvrashaemyj ej rezultat i edinstvennyj faktor okazyvayushij vliyanie na rezultat eto znacheniya argumentov Takim obrazom imeetsya vozmozhnost protestirovat kazhduyu funkciyu v programme prosto vychisliv eyo ot razlichnyh naborov znachenij argumentov Pri etom mozhno ne bespokoitsya ni o vyzove funkcij v pravilnom poryadke ni o pravilnom formirovanii vneshnego sostoyaniya Esli lyubaya funkciya v programme prohodit modulnye testy to mozhno byt uverennym v kachestve vsej programmy V imperativnyh programmah proverka vozvrashaemogo znacheniya funkcii nedostatochna funkciya mozhet modificirovat vneshnee sostoyanie kotoroe tozhe nuzhno proveryat chego ne nuzhno delat v funkcionalnyh programmah Vozmozhnosti optimizacii pri kompilyacii Tradicionno upominaemoj polozhitelnoj osobennostyu funkcionalnogo programmirovaniya yavlyaetsya to chto ono pozvolyaet opisyvat programmu v tak nazyvaemom deklarativnom vide kogda zhestkaya posledovatelnost vypolneniya mnogih operacij neobhodimyh dlya vychisleniya rezultata v yavnom vide ne zadayotsya a formiruetsya avtomaticheski v processe vychisleniya funkcij Eto obstoyatelstvo a takzhe otsutstvie sostoyanij dayot vozmozhnost primenyat k funkcionalnym programmam dostatochno slozhnye metody avtomaticheskoj optimizacii Vozmozhnosti parallelizma Eshyo odnim preimushestvom funkcionalnyh programm yavlyaetsya to chto oni predostavlyayut shirochajshie vozmozhnosti dlya avtomaticheskogo rasparallelivaniya vychislenij Poskolku otsutstvie pobochnyh effektov garantirovano v lyubom vyzove funkcii vsegda dopustimo parallelnoe vychislenie dvuh razlichnyh parametrov poryadok ih vychisleniya ne mozhet okazat vliyaniya na rezultat vyzova Nedostatki Nedostatki funkcionalnogo programmirovaniya vytekayut iz teh zhe samyh ego osobennostej Otsutstvie prisvaivanij i zamena ih na porozhdenie novyh dannyh privodyat k neobhodimosti postoyannogo vydeleniya i avtomaticheskogo osvobozhdeniya pamyati poetomu v sisteme ispolneniya funkcionalnoj programmy obyazatelnym istochnik ne ukazan 1627 dnej komponentom stanovitsya vysokoeffektivnyj sborshik musora Nestrogaya model vychislenij privodit k nepredskazuemomu poryadku vyzova funkcij chto sozdayot problemy pri vvode vyvode gde poryadok vypolneniya operacij vazhen Krome togo ochevidno funkcii vvoda v svoyom estestvennom vide naprimer getchar iz standartnoj biblioteki yazyka Si ne yavlyayutsya chistymi poskolku sposobny vozvrashat razlichnye znacheniya dlya odnih i teh zhe argumentov i dlya ustraneniya etogo trebuyutsya opredelyonnye uhishreniya Dlya preodoleniya nedostatkov funkcionalnyh programm uzhe pervye yazyki funkcionalnogo programmirovaniya vklyuchali ne tolko chisto funkcionalnye sredstva no i mehanizmy imperativnogo programmirovaniya prisvaivanie cikl neyavnyj PROGN byli uzhe v Lispe Ispolzovanie takih sredstv pozvolyaet reshit nekotorye prakticheskie problemy no oznachaet othod ot idej i preimushestv funkcionalnogo programmirovaniya i napisanie imperativnyh programm na funkcionalnyh yazykah V chistyh funkcionalnyh yazykah eti problemy reshayutsya drugimi sredstvami naprimer v yazyke Haskell vvod vyvod realizovan pri pomoshi monad koncepcii pozaimstvovannoj iz teorii kategorij PrimechaniyaA Fild P Harrison Funkcionalnoe programmirovanie Per s angl M Mir 1993 637 s il ISBN 5 03 001870 0 Str 120 Glava 6 Matematicheskie osnovy l ischislenie Tiobe Programming Community Index neopr Data obrasheniya 24 sentyabrya 2011 Arhivirovano 2 iyulya 2013 goda angl Conception evolution and application of functional programming languages angl Association for Computing Machinery Computing Surveys journal 1989 September vol 21 no 3 P 359 411 doi 10 1145 72551 72554 Arhivirovano 5 iyunya 2013 goda Rodzher Penrouz Glava 2 Lyambda ischislenie Chercha Novyj um korolya O kompyuterah myshlenii i zakonah fiziki The Emperors New Mind Concerning Computers Minds and The Laws of Physics Editorial URSS 2003 ISBN 5 354 00005 X pereizdanie ISBN 978 5 382 01266 7 2011 g angl History of Lisp In Association for Computing Machinery SIGPLAN History of Programming Languages Conference 1978 Iyun S 217 223 doi 10 1145 800025 808387 Arhivirovano 7 iyunya 2008 goda J Harrison 1997 Gl 3 l ischislenie kak yazyk programmirovaniya V svoih memuarah Gerbert Sajmon 1991 Models of My Life pp 189 190 ISBN 0 465 04640 1 utverzhdaet chto ego Al Nyuell i Kliff Shou kotoryh chasto nazyvayut roditelyami iskusstvennogo intellekta za napisanie programmy angl avtomaticheski dokazyvayushej teoremy iz Principia Mathematica Dlya togo chtoby dostich etogo oni dolzhny byli pridumat yazyk i paradigmu kotoruyu retrospektivno mozhno rassmatrivat kak funkcionalnoe programmirovanie History of Programming Languages IPL neopr Data obrasheniya 15 aprelya 2012 Arhivirovano iz originala 1 noyabrya 2006 goda XIV APL Session History of Programming Language Richard L Wexelbblat Academic Press 1981 S 661 693 749 s ISBN 0 12 745040 8 Evgenij Kirpichyov Elementy funkcionalnyh yazykov Praktika funkcionalnogo programmirovaniya 2009 Dekabr vyp 3 ISSN 2075 8456 Arhivirovano 3 sentyabrya 2017 goda Skachat PDF Tehniki funkcionalnogo programmirovaniya V A Potapenko str 8 Funkcii vysshih poryadkov neopr Data obrasheniya 10 yanvarya 2009 Arhivirovano 30 iyunya 2009 goda GCC Declaring Attributes of Functions neopr Data obrasheniya 28 avgusta 2012 Arhivirovano 18 avgusta 2012 goda XL Fortran for AIX V13 1 gt Language Reference Pure procedures Fortran 95 Tail call optimization neopr Data obrasheniya 31 iyulya 2012 Arhivirovano 1 avgusta 2012 goda Revised5 Report on the Algorithmic Language Scheme 3 5 Proper tail recursion neopr Data obrasheniya 31 iyulya 2012 Arhivirovano 5 yanvarya 2007 goda Fokkinga Maarten Paterson Ross 1991 Functional Programming with Bananas Lenses Envelopes and Barbed Wire PDF Conference on Functional Programming Languages and Computer Architecture FPCA Springer pp 124 144 CiteSeerX 10 1 1 41 125 ISBN 3 540 54396 1 Arhivirovano PDF 9 iyulya 2017 Data obrasheniya 3 marta 2020 Bird Richard Pearls of Functional Algorithm Design angl Cambrigde University Press 2010 277 p ISBN 978 0 521 51338 8 Arhivirovano 8 marta 2022 goda N A Roganova Funkcionalnoe programmirovanie Uchebnoe posobie dlya studentov vysshih uchebnyh zavedenij M GINFO 2002 260 s Str 14 p 3 1 Lenivye i energichnye vychisleniya Lazy Evaluation an overview ScienceDirect Topics neopr www sciencedirect com Data obrasheniya 23 marta 2021 Ahmechet V Funkcionalnoe programmirovanie dlya vseh neopr Data obrasheniya 11 yanvarya 2009 Arhivirovano 2 fevralya 2009 goda LiteraturaGorodnyaya L V Osnovy funkcionalnogo programmirovaniya Kurs lekcij M Internet universitet informacionnyh tehnologij 2004 S 280 ISBN 5 9556 0008 6 Dushkin R V Funkcionalnoe programmirovanie na yazyke Haskell M DMK Press 2006 S 608 ISBN 5 94074 335 8 Fild A Harrison P Funkcionalnoe programmirovanie Functional Programming M Mir 1993 637 s ISBN 5 03 001870 0 N A Roganova Funkcionalnoe programmirovanie Uchebnoe posobie dlya studentov vysshih uchebnyh zavedenij M GINFO 2002 260 s John Harrison Funkcionalnoe programmirovanie Kurs lekcij Functional Programming 1997 A M Mironov Teoriya funkcionalnyh programm SsylkiImeetsya vikiuchebnik po teme Osnovy funkcionalnogo programmirovaniya Zhurnal Praktika funkcionalnogo programmirovaniya vypuskalsya v 2009 2011 gody Dlya uluchsheniya etoj stati zhelatelno Prostavit snoski vnesti bolee tochnye ukazaniya na istochniki Pozhalujsta posle ispravleniya problemy isklyuchite eyo iz spiska parametrov Posle ustraneniya vseh nedostatkov etot shablon mozhet byt udalyon lyubym uchastnikom

NiNa.Az

NiNa.Az - Абсолютно бесплатная система, которая делится для вас информацией и контентом 24 часа в сутки.
Взгляните
Закрыто