ApplyLook up apply in Wiktionary, the free dictionary. In mathematics and computer science, apply is a function that applies a function to arguments. It is central to programming languages derived from lambda calculus, such as LISP and Scheme, and also in functional languages. It has a role in the study of the denotational semantics of computer programs, because it is a continuous function on complete partial orders. Apply is also a continuous function in homotopy theory, and, indeed underpins the entire theory: it allows a homotopy deformation to be viewed as a continuous path in the space of functions. Likewise, valid mutations (refactorings) of computer programs can be seen as those that are "continuous" in the Scott topology. The most general setting for apply is in category theory, where it is right adjoint to currying in closed monoidal categories. A special case of this are the Cartesian closed categories, whose internal language is simply typed lambda calculus. ProgrammingIn computer programming, apply applies a function to a list of arguments. Eval and apply are the two interdependent components of the eval-apply cycle, which is the essence of evaluating Lisp, described in SICP.[1] Function application corresponds to beta reduction in lambda calculus. Apply functionApply is also the name of a special function in many languages, which takes a function and a list, and uses the list as the function's own argument list, as if the function were called with the elements of the list as the arguments. This is important in languages with variadic functions, because this is the only way to call a function with an indeterminate (at compile time) number of arguments. Common Lisp and SchemeIn Common Lisp apply is a function that applies a function to a list of arguments (note here that "+" is a variadic function that takes any number of arguments): (apply #'+ (list 1 2))
Similarly in Scheme: (apply + (list 1 2))
C++In C++, Bind [2] is used either via the std namespace or via the boost namespace. C# and JavaIn C# and Java, variadic arguments are simply collected in an array. Caller can explicitly pass in an array in place of the variadic arguments. This can only be done for a variadic parameter. It is not possible to apply an array of arguments to non-variadic parameter without using reflection. An ambiguous case arises should the caller want to pass an array itself as one of the arguments rather than using the array as a list of arguments. In this case, the caller should cast the array to variadicFunc(arrayOfArgs);
With version 8 lambda expressions were introduced. Functions are implemented as objects with a functional interface, an interface with only one non-static method. The standard interface Function<T,R>
consist of the method (plus some static utility functions): R apply(T para)
GoIn Go, typed variadic arguments are simply collected in a slice. The caller can explicitly pass in a slice in place of the variadic arguments, by appending a s := []string{"foo", "bar"}
variadicFunc(s...)
HaskellIn Haskell, functions may be applied by simple juxtaposition: func param1 param2 ...
In Haskell, the syntax may also be interpreted that each parameter curries its function in turn. In the above example, "func param1" returns another function accepting one fewer parameters, that is then applied to param2, and so on, until the function has no more parameters. JavaScriptIn JavaScript, function objects have an func.apply(null, args);
ES6 adds the spread operator LuaIn Lua, apply can be written this way: function apply(f,...)
return f(...)
end
PerlIn Perl, arrays, hashes and expressions are automatically "flattened" into a single list when evaluated in a list context, such as in the argument list of a function # Equivalent subroutine calls:
@args = (@some_args, @more_args);
func(@args);
func(@some_args, @more_args);
PHPIn PHP, call_user_func_array('func_name', $args);
Python and RubyIn Python and Ruby, the same asterisk notation used in defining variadic functions is used for calling a function on a sequence and array respectively: func(*args)
Python originally had an apply function, but this was deprecated in favour of the asterisk in 2.3 and removed in 3.0.[4] RIn R, f(x1, x2)
# can also be performed via
do.call(what = f, args = list(x1, x2))
SmalltalkIn Smalltalk, block (function) objects have a aBlock valueWithArguments: args
Tcl
Since Tcl 8.5,[5] a function can be applied to arguments with the apply func ?arg1 arg2 ...?
where the function is a two element list {args body} or a three element list {args body namespace}. Universal propertyConsider a function , that is, where the bracket notation denotes the space of functions from A to B. By means of currying, there is a unique function . Then Apply provides the universal morphism
so that or, equivalently one has the commuting diagram More precisely, curry and apply are adjoint functors.
Also, in category theory, curry is commonly denoted by , so that is written for curry(g). This notation is in conflict with the use of in lambda calculus, where lambda is used to denote bound variables. With all of these notational changes accounted for, the adjointness of Apply and curry is then expressed in the commuting diagram The articles on exponential object and Cartesian closed category provide a more precise discussion of the category-theoretic formulation of this idea. Thus the use of lambda here is not accidental; the internal language of Cartesian closed categories is simply-typed lambda calculus. The most general possible setting for Apply are the closed monoidal categories, of which the cartesian closed categories are an example. In homological algebra, the adjointness of curry and apply is known as tensor-hom adjunction. Topological propertiesIn order theory, in the category of complete partial orders endowed with the Scott topology, both curry and apply are continuous functions (that is, they are Scott continuous).[7] This property helps establish the foundational validity of the study of the denotational semantics of computer programs. In algebraic geometry and homotopy theory, curry and apply are both continuous functions when the space of continuous functions from to is given the compact open topology, and is locally compact Hausdorff. This result is very important, in that it underpins homotopy theory, allowing homotopic deformations to be understood as continuous paths in the space of functions. References
|