Частичное применение — возможность в ряде языков программирования зафиксировать часть аргументов многоместной функции и создать другую функцию, меньшей арности. Например, имея трёхместную функцию
f
:
(
X
×
Y
×
Z
)
→
N
{\displaystyle f\colon (X\times Y\times Z)\to N}
, можно зафиксировать («привязать») первый аргумент
x
0
∈
X
{\displaystyle x_{0}\in X}
, и построить бинарную функцию
f
x
0
:
(
Y
×
Z
)
→
N
{\displaystyle f_{x_{0}}\colon (Y\times Z)\to N}
такую, что
f
x
0
(
y
,
z
)
=
f
(
x
0
,
y
,
z
)
{\displaystyle f_{x_{0}}(y,z)=f(x_{0},y,z)}
для любых
y
∈
Y
,
z
∈
Z
{\displaystyle y\in Y,z\in Z}
.
В практике программирования частичное применение используется в связи с тем, что функции, полученные путём фиксации некоторого количества аргументов, зачастую оказываются полезными. К примеру, многие языки программирования имеют функцию или оператор инкремента (являющимся фиксацией единицы как одного из аргументов двухместного сложения) или функцию обращения значения. Частичное применение возможно реализовать практически во всех языках программирования, обладающих возможностью определения многоместных функций. В ряде языков есть специализированные конструкции для частичного применения, например, в стандартной библиотеке C++ имеется функция bind, которая на входе принимает имя функции и аргументы, и возвращает функциональный объект — результат частичного применения переданного набора аргументов к функции.
В ряде функциональных языков программирования, таких как ML и Haskell, функции объявляются в каррированной форме по умолчанию, то есть, понятие о многоместности функций реализуется средствами одноместных функций высших порядков; в этих условиях частичным применением (называемом в этих языках сечением операторов) оказывается всякая передача неполного числа аргументов.
В языках программирования с функциями первого класса можно определить curry, uncurry и papply, чтобы осуществить каррирование и частичное применение напрямую (при этом связь между ними следующая: curry papply = curry). Но такой подход может привести к дольшему времени выполнения программы в связи с созданием дополнительных замыканий, в то время как Haskell позволяет использовать более эффективные приёмы.
View More On Wikipedia.org