Content deleted Content added
m →JavaScript: Added a more legible equivalent to the arrow-function syntax, for non-Js users. |
Tags: Mobile edit Mobile web edit |
||
(33 intermediate revisions by 23 users not shown) | |||
Line 1:
{{Short description|Function that takes one or more functions as an input or that outputs a function}}{{More sources|date=November 2024}}{{Distinguish|Functor{{!}}Functor (category theory)}}In [[mathematics]] and [[computer science]], a '''higher-order function''' ('''HOF''') is a [[function (mathematics)|function]] that does at least one of the following:▼
▲In [[mathematics]] and [[computer science]], a '''higher-order function''' is a [[function (mathematics)|function]] that does at least one of the following:
* takes one or more functions as arguments (i.e. a [[procedural parameter]], which is a [[Parameter (computer science)|parameter]] of a [[Subroutine|procedure]] that is itself a procedure),
* returns a function as its result.
All other functions are ''first-order functions''.
In the untyped [[lambda calculus]], all functions are higher-order; in a [[typed lambda calculus]], from which most [[functional programming]] languages are derived, higher-order functions that take one function as argument are values with types of the form <math>(\tau_1\to\tau_2)\to\tau_3</math>.
==General examples==
* <code>[[map (higher-order function)|map]]</code> function, found in many functional programming languages, is one example of a higher-order function.
* Sorting functions, which take a comparison function as a parameter, allowing the programmer to separate the sorting algorithm from the comparisons of the items being sorted.
* [[Filter (higher-order function) | filter]]
* [[fold (higher-order function)|fold]]
* [[Prefix sum|scan]]
* [[apply]]
* [[Function composition (computer science)|Function composition]]
Line 60 ⟶ 59:
<syntaxhighlight lang="c++">
import std;
auto twice = [](const std::function<int(int)>& f) -> auto {
▲ return [&f](int x) {
return f(f(x));
};
};
auto
return i + 3;
};
int main() {
▲ auto g = twice(plus_three);
std::
}
</syntaxhighlight>
Line 86 ⟶ 81:
<syntaxhighlight lang="c++">
import std;
auto twice = [](const auto& f) -> auto {
▲ return [&f](int x) {
return f(f(x));
};
};
auto
return i + 3;
};
int main() {
▲ auto g = twice(plus_three);
std::
}
</syntaxhighlight>
Line 254 ⟶ 246:
end
plus_three = fn(i) ->
g = Hof.twice(plus_three)
Line 268 ⟶ 260:
end
plus_three = fn(i) ->
g = twice.(plus_three)
Line 330 ⟶ 322:
Notice a function literal can be defined either with an identifier ({{code|twice}}) or anonymously (assigned to variable {{code|plusThree}}).
====Groovy====
{{further information|Groovy (programming language)}}
<syntaxhighlight lang="groovy">def twice = { f, x -> f(f(x)) }
def plusThree = { it + 3 }
def g = twice.curry(plusThree)
println g(7) // 13
</syntaxhighlight>▼
====Haskell====
{{further information|Haskell
<syntaxhighlight lang="haskell">
Line 423 ⟶ 425:
With arrow functions:
<syntaxhighlight lang="javascript">
"use strict";
Line 436 ⟶ 439:
Or with classical syntax:
<syntaxhighlight lang="javascript">
"use strict";
Line 443 ⟶ 447:
return f(f(x));
};
}
function plusThree(i) {
Line 450 ⟶ 454:
const g = twice(plusThree);
console.log(g(7)); // 13
</syntaxhighlight>
Line 512 ⟶ 517:
==== MATLAB ====
{{
<syntaxhighlight lang="matlab">
function result = twice(f)
end
Line 531 ⟶ 532:
==== OCaml ====
{{
<syntaxhighlight lang="ocaml" start="1">
Line 626 ⟶ 627:
my $plusThree = sub {
my ($
$
};
Line 638 ⟶ 639:
{{further information|Python (programming language)}}
<syntaxhighlight lang="
# prints 13
</syntaxhighlight>
Python decorator syntax is often used to replace a function with the result of passing that function through a higher-order function. E.g., the function {{code|g}} could be implemented equivalently:
<syntaxhighlight lang="
# prints 13
</syntaxhighlight>
Line 667 ⟶ 668:
<syntaxhighlight lang="R">
twice <-
f(f(x))▼
plusThree <- function(i)
g <- twice(plusThree)
>
[1] 13
</syntaxhighlight>
Line 703 ⟶ 698:
====Ruby====
{{further information|
<syntaxhighlight lang="ruby">
Line 759 ⟶ 754:
<syntaxhighlight lang="scheme">
(define (
(
(display ((f 3) 7))▼
(display (add 3 7))▼
▲</syntaxhighlight>
(define (twice f)
(compose f f))
(define (plus-three i)
(define g (twice plus-three))
</syntaxhighlight>
====Swift====
Line 827 ⟶ 828:
=== Alternatives ===
====Function pointers====
[[Function pointer]]s in languages such as [[C (programming language)|C]], [[C++]], [[Fortran]], and [[Pascal (programming language)|Pascal]] allow programmers to pass around references to functions. The following C code computes an approximation of the integral of an arbitrary function:
<syntaxhighlight lang="c">
Line 865 ⟶ 866:
====Macros====
[[Macro (computer science)|Macros]] can also be used to achieve some of the effects of higher-order functions.
====Dynamic code evaluation====
In other [[imperative programming]] languages, it is possible to achieve some of the same algorithmic results as are obtained via higher-order functions by dynamically executing code (sometimes called ''Eval'' or ''Execute'' operations) in the scope of evaluation.
*The argument code to be executed is usually not [[type system#Static typing|statically typed]]; these languages generally rely on [[type system#Dynamic typing|dynamic typing]] to determine the well-formedness and safety of the code to be executed.
*The argument is usually provided as a string, the value of which may not be known until run-time.
====Objects====
Line 959 ⟶ 960:
==References==
{{Reflist}}
{{Functions navbox}}
[[Category:Functional programming]]
Line 966:
[[Category:Higher-order functions| ]]
[[Category:Subroutines]]
[[Category:Articles with example
[[Category:Articles with example C++ code]]
[[Category:Articles with example D code]]
[[Category:Articles with example Haskell code]]
[[Category:Articles with example
[[Category:Articles with example JavaScript code]]
[[Category:Articles with example
[[Category:Articles with example Lisp (programming language) code]]
[[Category:Articles with example MATLAB/Octave code]]
[[Category:Articles with example Pascal code]]
[[Category:Articles with example Perl code]]
[[Category:Articles with example PHP code]]
[[Category:Articles with example Python (programming language) code]]
[[Category:Articles with example R code]]
[[Category:Articles with example Scala code]]
[[Category:Articles with example Scheme (programming language) code]]
[[Category:Articles with example Tcl code]]
[[Category:Articles with example Swift code]]
|