Частичное применение

Перейти к навигацииПерейти к поиску

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

В практике программирования частичное применение используется в связи с тем, что функции, полученные путём фиксации некоторого количества аргументов, зачастую оказываются полезными. К примеру, многие языки программирования имеют функцию или оператор инкремента (являющимся фиксацией единицы как одного из аргументов двухместного сложения) или функцию обращения значения. Частичное применение возможно реализовать практически во всех языках программирования, обладающих возможностью определения многоместных функций. В ряде языков есть специализированные конструкции для частичного применения, например, в стандартной библиотеке C++ имеется функция bind, которая на входе принимает имя функции и аргументы, и возвращает функциональный объект — результат частичного применения переданного набора аргументов к функции.

В ряде функциональных языков программирования, таких как ML и Haskell, функции объявляются в каррированной форме по умолчанию, то есть, понятие о многоместности функций реализуется средствами одноместных функций высших порядков; в этих условиях частичным применением (называемом в этих языках сечением операторов) оказывается всякая передача неполного числа аргументов[1].

В языках программирования с функциями первого класса можно определить curry, uncurry и papply, чтобы осуществить каррирование и частичное применение напрямую (при этом связь между ними следующая: curry papply = curry). Но такой подход может привести к дольшему времени выполнения программы в связи с созданием дополнительных замыканий, в то время как Haskell позволяет использовать более эффективные приёмы[2].

Примечания

  1. Денис Москвин. Сечения композиции как инструмент бесточечного стиля // Практика функционального программирования. — 2010. — № 4. — С. 89—104. Архивировано 22 мая 2017 года.
  2. Марлоу — Пейтон-Джонс, 2004.

Литература

  • Simon Marlow, Simon Peyton Jones. Making a Fast Curry: Push/Enter vs. Eval/Apply for Higher-order Languages // ACM SIGPLAN Notices. — 2004. — Т. 39, № 9 (ICFP ’04 dedicated issue). — doi:10.1145/1016848.1016856.
  • Бенджамин Пирс. Типы в языках программирования = Types and Programming Languages. — Добросвет, 2012. — 680 с. — ISBN 978-5-7913-0082-9.