Partial application

In computer science, partial application (or partial function application) refers to the process of fixing a number of arguments to a function, producing another function of smaller arity. Given a function , we might fix (or 'bind') the first argument, producing a function of type . Evaluation of this function might be represented as . Note that the result of partial function application in this case is a function that takes two arguments. Partial application is sometimes (incorrectly) called currying, which is a related, but distinct concept.

Motivation

Intuitively, partial function application says "if you fix the first arguments of the function, you get a function of the remaining arguments". For example, if function div stands for the division operation x / y, then div with the parameter x fixed at 1 (i.e. div 1) is another function: the same as the function inv that returns the multiplicative inverse of its argument, defined by inv(y) = 1 / y.

The practical motivation for partial application is that very often the functions obtained by supplying some but not all of the arguments to a function are useful; for example, many languages have a function or operator similar to plus_one. Partial application makes it easy to define these functions, for example by creating a function that represents the addition operator with 1 bound as its first argument.

Implementations

In languages such as ML and Haskell functions are defined in curried form by default. Supplying fewer than the total number of arguments is referred to as partial application.

In languages with first-class functions one can define curry, uncurry and papply to perform currying and partial application explicitly. This might incur a greater run-time overhead due to the creation of additional closures, while Haskell can use more efficient techniques.[1]

Scala implements optional partial application with placeholder, e.g. def add(x: Int, y: Int) = {x+y}; add(1, _: Int) returns an incrementing function. Scala also support multiple parameter lists as currying, e.g. def add(x: Int)(y: Int) = {x+y}; add(1) _

Clojure implements partial application using the partial function defined in its core library.

The C++ standard library provides bind(function, args..) to return a function object that is the result of partial application of the given arguments to the given function.

In Java, MethodHandle.bindTo partially applies a function to its first argument.[2]

In Perl 6, the assuming method creates a new function with fewer parameters.[3]

The Python (programming language) standard library module functools includes the partial function, allowing positional and named argument bindings, returning a new function.

Definitions

In the simply-typed lambda calculus with function and product types (λ→,×) partial application, currying and uncurrying can be defined as:

papply 
(((a × b) → c) × a) → (bc) = λ(f, x). λy. f (x, y)
curry 
((a × b) → c) → (a → (bc)) = λf. λx. λy. f (x, y)
uncurry 
(a → (bc)) → ((a × b) → c) = λf. λ(x, y). f x y

Note that curry papply = curry.

See also

Notes

Further reading

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.