@librechat/agents 2.4.317 → 2.4.319
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/events.cjs +3 -3
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/main.cjs +5 -2
- package/dist/cjs/main.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs +23 -0
- package/dist/cjs/messages/ids.cjs.map +1 -0
- package/dist/cjs/stream.cjs +8 -155
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +144 -0
- package/dist/cjs/tools/handlers.cjs.map +1 -0
- package/dist/cjs/tools/search/content.cjs +140 -0
- package/dist/cjs/tools/search/content.cjs.map +1 -0
- package/dist/cjs/tools/search/firecrawl.cjs +17 -37
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs +79 -29
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/highlights.cjs +64 -13
- package/dist/cjs/tools/search/highlights.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +13 -15
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +42 -12
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +35 -0
- package/dist/cjs/tools/search/utils.cjs.map +1 -0
- package/dist/esm/events.mjs +1 -1
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/main.mjs +3 -1
- package/dist/esm/main.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs +21 -0
- package/dist/esm/messages/ids.mjs.map +1 -0
- package/dist/esm/stream.mjs +7 -152
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +141 -0
- package/dist/esm/tools/handlers.mjs.map +1 -0
- package/dist/esm/tools/search/content.mjs +119 -0
- package/dist/esm/tools/search/content.mjs.map +1 -0
- package/dist/esm/tools/search/firecrawl.mjs +18 -37
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs +79 -29
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/highlights.mjs +64 -13
- package/dist/esm/tools/search/highlights.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +12 -14
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +42 -12
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +32 -0
- package/dist/esm/tools/search/utils.mjs.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/messages/ids.d.ts +3 -0
- package/dist/types/messages/index.d.ts +1 -0
- package/dist/types/stream.d.ts +0 -8
- package/dist/types/tools/handlers.d.ts +8 -0
- package/dist/types/tools/search/content.d.ts +4 -0
- package/dist/types/tools/search/firecrawl.d.ts +6 -86
- package/dist/types/tools/search/format.d.ts +4 -1
- package/dist/types/tools/search/highlights.d.ts +1 -1
- package/dist/types/tools/search/search.d.ts +1 -1
- package/dist/types/tools/search/test.d.ts +1 -0
- package/dist/types/tools/search/tool.d.ts +12 -4
- package/dist/types/tools/search/types.d.ts +388 -53
- package/dist/types/tools/search/utils.d.ts +3 -0
- package/package.json +2 -1
- package/src/events.ts +49 -15
- package/src/index.ts +1 -0
- package/src/messages/ids.ts +26 -0
- package/src/messages/index.ts +1 -0
- package/src/scripts/search.ts +5 -3
- package/src/stream.ts +4 -186
- package/src/tools/handlers.ts +167 -0
- package/src/tools/search/content.test.ts +173 -0
- package/src/tools/search/content.ts +147 -0
- package/src/tools/search/firecrawl.ts +27 -144
- package/src/tools/search/format.ts +89 -31
- package/src/tools/search/highlights.ts +99 -17
- package/src/tools/search/output.md +2775 -0
- package/src/tools/search/search.ts +42 -54
- package/src/tools/search/test.html +884 -0
- package/src/tools/search/test.md +643 -0
- package/src/tools/search/test.ts +159 -0
- package/src/tools/search/tool.ts +52 -15
- package/src/tools/search/types.ts +439 -61
- package/src/tools/search/utils.ts +43 -0
|
@@ -0,0 +1,643 @@
|
|
|
1
|
+
[Jump to content](https://en.wikipedia.org/wiki/Functional_programming#bodyContent)
|
|
2
|
+
|
|
3
|
+
[](https://en.wikipedia.org/wiki/File:En-Functional_programming.ogg "Listen to this article")
|
|
4
|
+
|
|
5
|
+
From Wikipedia, the free encyclopedia
|
|
6
|
+
|
|
7
|
+
Programming paradigm based on applying and composing functions
|
|
8
|
+
|
|
9
|
+
For subroutine-oriented programming, see [Procedural programming](https://en.wikipedia.org/wiki/Procedural_programming "Procedural programming").
|
|
10
|
+
|
|
11
|
+
In [computer science](https://en.wikipedia.org/wiki/Computer_science "Computer science"), **functional programming** is a [programming paradigm](https://en.wikipedia.org/wiki/Programming_paradigm "Programming paradigm") where programs are constructed by [applying](https://en.wikipedia.org/wiki/Function_application "Function application") and [composing](https://en.wikipedia.org/wiki/Function_composition_(computer_science) "Function composition (computer science)") [functions](https://en.wikipedia.org/wiki/Function_(computer_science) "Function (computer science)"). It is a [declarative programming](https://en.wikipedia.org/wiki/Declarative_programming "Declarative programming") paradigm in which function definitions are [trees](https://en.wikipedia.org/wiki/Tree_(data_structure) "Tree (data structure)") of [expressions](https://en.wikipedia.org/wiki/Expression_(computer_science) "Expression (computer science)") that map [values](https://en.wikipedia.org/wiki/Value_(computer_science) "Value (computer science)") to other values, rather than a sequence of [imperative](https://en.wikipedia.org/wiki/Imperative_programming "Imperative programming") [statements](https://en.wikipedia.org/wiki/Statement_(computer_science) "Statement (computer science)") which update the [running state](https://en.wikipedia.org/wiki/State_(computer_science) "State (computer science)") of the program.
|
|
12
|
+
|
|
13
|
+
In functional programming, functions are treated as [first-class citizens](https://en.wikipedia.org/wiki/First-class_citizen "First-class citizen"), meaning that they can be bound to names (including local [identifiers](https://en.wikipedia.org/wiki/Identifier_(computer_languages) "Identifier (computer languages)")), passed as [arguments](https://en.wikipedia.org/wiki/Parameter_(computer_programming) "Parameter (computer programming)"), and [returned](https://en.wikipedia.org/wiki/Return_value "Return value") from other functions, just as any other [data type](https://en.wikipedia.org/wiki/Data_type "Data type") can. This allows programs to be written in a [declarative](https://en.wikipedia.org/wiki/Declarative_programming "Declarative programming") and [composable](https://en.wikipedia.org/wiki/Composability "Composability") style, where small functions are combined in a [modular](https://en.wikipedia.org/wiki/Modular_programming "Modular programming") manner.
|
|
14
|
+
|
|
15
|
+
Functional programming is sometimes treated as synonymous with [purely functional programming](https://en.wikipedia.org/wiki/Purely_functional_programming "Purely functional programming"), a subset of functional programming that treats all functions as [deterministic](https://en.wikipedia.org/wiki/Deterministic_system "Deterministic system") mathematical [functions](https://en.wikipedia.org/wiki/Function_(mathematics) "Function (mathematics)"), or [pure functions](https://en.wikipedia.org/wiki/Pure_function "Pure function"). When a pure function is called with some given arguments, it will always return the same result, and cannot be affected by any mutable [state](https://en.wikipedia.org/wiki/State_(computer_science) "State (computer science)") or other [side effects](https://en.wikipedia.org/wiki/Side_effect_(computer_science) "Side effect (computer science)"). This is in contrast with impure [procedures](https://en.wikipedia.org/wiki/Procedure_(computer_science) "Procedure (computer science)"), common in [imperative programming](https://en.wikipedia.org/wiki/Imperative_programming "Imperative programming"), which can have side effects (such as modifying the program's state or taking input from a user). Proponents of purely functional programming claim that by restricting side effects, programs can have fewer [bugs](https://en.wikipedia.org/wiki/Software_bug "Software bug"), be easier to [debug](https://en.wikipedia.org/wiki/Debugging "Debugging") and [test](https://en.wikipedia.org/wiki/Software_testing "Software testing"), and be more suited to [formal verification](https://en.wikipedia.org/wiki/Formal_verification "Formal verification").[\\[1\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-hudak1989-1)[\\[2\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-hughesWhyFPMatters-2)
|
|
16
|
+
|
|
17
|
+
Functional programming has its roots in [academia](https://en.wikipedia.org/wiki/Academia "Academia"), evolving from the [lambda calculus](https://en.wikipedia.org/wiki/Lambda_calculus "Lambda calculus"), a formal system of computation based only on functions. Functional programming has historically been less popular than imperative programming, but many functional languages are seeing use today in industry and education, including [Common Lisp](https://en.wikipedia.org/wiki/Common_Lisp "Common Lisp"), [Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language) "Scheme (programming language)"),[\\[3\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-clinger1987-3)[\\[4\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-hartheimer1987-4)[\\[5\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-kidd2007-5)[\\[6\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-cleis2006-6) [Clojure](https://en.wikipedia.org/wiki/Clojure "Clojure"), [Wolfram Language](https://en.wikipedia.org/wiki/Wolfram_Language "Wolfram Language"),[\\[7\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-reference.wolfram.com-7)[\\[8\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Amath-CO-8) [Racket](https://en.wikipedia.org/wiki/Racket_(programming_language) "Racket (programming language)"),[\\[9\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-racket-video-games-9) [Erlang](https://en.wikipedia.org/wiki/Erlang_(programming_language) "Erlang (programming language)"),[\\[10\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-erlang-faq-10)[\\[11\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-armstrong2007-11)[\\[12\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-larson2009-12) [Elixir](https://en.wikipedia.org/wiki/Elixir_(programming_language) "Elixir (programming language)"),[\\[13\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-13) [OCaml](https://en.wikipedia.org/wiki/OCaml "OCaml"),[\\[14\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-minksy2008-14)[\\[15\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-leroy2007-15) [Haskell](https://en.wikipedia.org/wiki/Haskell "Haskell"),[\\[16\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-haskell-industry-16)[\\[17\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-hudak2007-17) and [F#](https://en.wikipedia.org/wiki/F_Sharp_(programming_language) "F Sharp (programming language)").[\\[18\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-quantFSharp-18)[\\[19\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-businessAppsFSharp-19) [Lean](https://en.wikipedia.org/wiki/Lean_(proof_assistant) "Lean (proof assistant)") is a functional programming language commonly used for verifying mathematical theorems.[\\[20\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-20) Functional programming is also key to some languages that have found success in specific domains, like [JavaScript](https://en.wikipedia.org/wiki/JavaScript "JavaScript") in the Web,[\\[21\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-21) [R](https://en.wikipedia.org/wiki/R_(programming_language) "R (programming language)") in statistics,[\\[22\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-useR-22)[\\[23\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Chambers-23) [J](https://en.wikipedia.org/wiki/J_(programming_language) "J (programming language)"), [K](https://en.wikipedia.org/wiki/K_(programming_language) "K (programming language)") and [Q](https://en.wikipedia.org/wiki/Q_(programming_language_from_Kx_Systems) "Q (programming language from Kx Systems)") in financial analysis, and [XQuery](https://en.wikipedia.org/wiki/XQuery "XQuery")/ [XSLT](https://en.wikipedia.org/wiki/XSLT "XSLT") for [XML](https://en.wikipedia.org/wiki/XML "XML").[\\[24\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Novatchev-24)[\\[25\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Mertz-25) Domain-specific declarative languages like [SQL](https://en.wikipedia.org/wiki/SQL "SQL") and [Lex](https://en.wikipedia.org/wiki/Lex_(software) "Lex (software)")/ [Yacc](https://en.wikipedia.org/wiki/Yacc "Yacc") use some elements of functional programming, such as not allowing [mutable values](https://en.wikipedia.org/wiki/Mutable_object "Mutable object").[\\[26\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Chamberlin_Boyce-26) In addition, many other programming languages support programming in a functional style or have implemented features from functional programming, such as [C++11](https://en.wikipedia.org/wiki/C%2B%2B11 "C++11"), [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language) "C Sharp (programming language)"),[\\[27\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-27) [Kotlin](https://en.wikipedia.org/wiki/Kotlin_(programming_language) "Kotlin (programming language)"),[\\[28\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-:0-28) [Perl](https://en.wikipedia.org/wiki/Perl "Perl"),[\\[29\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-29) [PHP](https://en.wikipedia.org/wiki/PHP "PHP"),[\\[30\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-30) [Python](https://en.wikipedia.org/wiki/Python_(programming_language) "Python (programming language)"),[\\[31\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-AutoNT-13-31) [Go](https://en.wikipedia.org/wiki/Go_(programming_language) "Go (programming language)"),[\\[32\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-32) [Rust](https://en.wikipedia.org/wiki/Rust_(programming_language) "Rust (programming language)"),[\\[33\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-33) [Raku](https://en.wikipedia.org/wiki/Raku_(programming_language) "Raku (programming language)"),[\\[34\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-34) [Scala](https://en.wikipedia.org/wiki/Scala_(programming_language) "Scala (programming language)"),[\\[35\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-effective-scala-35) and [Java (since Java 8)](https://en.wikipedia.org/wiki/Java_(programming_language) "Java (programming language)").[\\[36\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-java-8-javadoc-36)
|
|
18
|
+
|
|
19
|
+
## History
|
|
20
|
+
|
|
21
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=1 "Edit section: History")\\]
|
|
22
|
+
|
|
23
|
+
The [lambda calculus](https://en.wikipedia.org/wiki/Lambda_calculus "Lambda calculus"), developed in the 1930s by [Alonzo Church](https://en.wikipedia.org/wiki/Alonzo_Church "Alonzo Church"), is a [formal system](https://en.wikipedia.org/wiki/Formal_system "Formal system") of [computation](https://en.wikipedia.org/wiki/Computation "Computation") built from [function application](https://en.wikipedia.org/wiki/Function_application "Function application"). In 1937 [Alan Turing](https://en.wikipedia.org/wiki/Alan_Turing "Alan Turing") proved that the lambda calculus and [Turing machines](https://en.wikipedia.org/wiki/Turing_machines "Turing machines") are equivalent models of computation,[\\[37\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-37) showing that the lambda calculus is [Turing complete](https://en.wikipedia.org/wiki/Turing_complete "Turing complete"). Lambda calculus forms the basis of all functional programming languages. An equivalent theoretical formulation, [combinatory logic](https://en.wikipedia.org/wiki/Combinatory_logic "Combinatory logic"), was developed by [Moses Schönfinkel](https://en.wikipedia.org/wiki/Moses_Sch%C3%B6nfinkel "Moses Schönfinkel") and [Haskell Curry](https://en.wikipedia.org/wiki/Haskell_Curry "Haskell Curry") in the 1920s and 1930s.[\\[38\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-38)
|
|
24
|
+
|
|
25
|
+
Church later developed a weaker system, the [simply typed lambda calculus](https://en.wikipedia.org/wiki/Simply_typed_lambda_calculus "Simply typed lambda calculus"), which extended the lambda calculus by assigning a [data type](https://en.wikipedia.org/wiki/Data_type "Data type") to all terms.[\\[39\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-39) This forms the basis for statically typed functional programming.
|
|
26
|
+
|
|
27
|
+
The first [high-level](https://en.wikipedia.org/wiki/High-level_programming_language "High-level programming language") functional programming language, [Lisp](https://en.wikipedia.org/wiki/Lisp_(programming_language) "Lisp (programming language)"), was developed in the late 1950s for the [IBM 700/7000 series](https://en.wikipedia.org/wiki/IBM_700/7000_series#Scientific_Architecture "IBM 700/7000 series") of scientific computers by [John McCarthy](https://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist) "John McCarthy (computer scientist)") while at [Massachusetts Institute of Technology](https://en.wikipedia.org/wiki/Massachusetts_Institute_of_Technology "Massachusetts Institute of Technology") (MIT).[\\[40\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-40) Lisp functions were defined using Church's lambda notation, extended with a label construct to allow [recursive](https://en.wikipedia.org/wiki/Recursion_(computer_science) "Recursion (computer science)") functions.[\\[41\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-41) Lisp first introduced many paradigmatic features of functional programming, though early Lisps were [multi-paradigm languages](https://en.wikipedia.org/wiki/Programming_paradigm#Multi-paradigm "Programming paradigm"), and incorporated support for numerous programming styles as new paradigms evolved. Later dialects, such as [Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language) "Scheme (programming language)") and [Clojure](https://en.wikipedia.org/wiki/Clojure "Clojure"), and offshoots such as [Dylan](https://en.wikipedia.org/wiki/Dylan_(programming_language) "Dylan (programming language)") and [Julia](https://en.wikipedia.org/wiki/Julia_(programming_language) "Julia (programming language)"), sought to simplify and rationalise Lisp around a cleanly functional core, while [Common Lisp](https://en.wikipedia.org/wiki/Common_Lisp "Common Lisp") was designed to preserve and update the paradigmatic features of the numerous older dialects it replaced.[\\[42\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-42)
|
|
28
|
+
|
|
29
|
+
[Information Processing Language](https://en.wikipedia.org/wiki/Information_Processing_Language "Information Processing Language") (IPL), 1956, is sometimes cited as the first computer-based functional programming language.[\\[43\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-43) It is an [assembly-style language](https://en.wikipedia.org/wiki/Assembly_language "Assembly language") for manipulating lists of symbols. It does have a notion of _generator_, which amounts to a function that accepts a function as an argument, and, since it is an assembly-level language, code can be data, so IPL can be regarded as having higher-order functions. However, it relies heavily on the mutating list structure and similar imperative features.
|
|
30
|
+
|
|
31
|
+
[Kenneth E. Iverson](https://en.wikipedia.org/wiki/Kenneth_E._Iverson "Kenneth E. Iverson") developed [APL](https://en.wikipedia.org/wiki/APL_(programming_language) "APL (programming language)") in the early 1960s, described in his 1962 book _A Programming Language_ ( [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [9780471430148](https://en.wikipedia.org/wiki/Special:BookSources/9780471430148 "Special:BookSources/9780471430148")). APL was the primary influence on [John Backus](https://en.wikipedia.org/wiki/John_Backus "John Backus")'s [FP](https://en.wikipedia.org/wiki/FP_(programming_language) "FP (programming language)"). In the early 1990s, Iverson and [Roger Hui](https://en.wikipedia.org/wiki/Roger_Hui "Roger Hui") created [J](https://en.wikipedia.org/wiki/J_(programming_language) "J (programming language)"). In the mid-1990s, [Arthur Whitney](https://en.wikipedia.org/wiki/Arthur_Whitney_(computer_scientist) "Arthur Whitney (computer scientist)"), who had previously worked with Iverson, created [K](https://en.wikipedia.org/wiki/K_(programming_language) "K (programming language)"), which is used commercially in financial industries along with its descendant [Q](https://en.wikipedia.org/wiki/Q_(programming_language_from_Kx_Systems) "Q (programming language from Kx Systems)").
|
|
32
|
+
|
|
33
|
+
In the mid-1960s, [Peter Landin](https://en.wikipedia.org/wiki/Peter_Landin "Peter Landin") invented [SECD machine](https://en.wikipedia.org/wiki/SECD_machine "SECD machine"),[\\[44\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-44) the first [abstract machine](https://en.wikipedia.org/wiki/Abstract_machine "Abstract machine") for a functional programming language,[\\[45\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-45) described a correspondence between [ALGOL 60](https://en.wikipedia.org/wiki/ALGOL_60 "ALGOL 60") and the [lambda calculus](https://en.wikipedia.org/wiki/Lambda_calculus "Lambda calculus"),[\\[46\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-46)[\\[47\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-47) and proposed the [ISWIM](https://en.wikipedia.org/wiki/ISWIM "ISWIM") programming language.[\\[48\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-48)
|
|
34
|
+
|
|
35
|
+
[John Backus](https://en.wikipedia.org/wiki/John_Backus "John Backus") presented [FP](https://en.wikipedia.org/wiki/FP_(programming_language) "FP (programming language)") in his 1977 [Turing Award](https://en.wikipedia.org/wiki/Turing_Award "Turing Award") lecture "Can Programming Be Liberated From the [von Neumann](https://en.wikipedia.org/wiki/Von_Neumann_architecture "Von Neumann architecture") Style? A Functional Style and its Algebra of Programs".[\\[49\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Backus_1977-49) He defines functional programs as being built up in a hierarchical way by means of "combining forms" that allow an "algebra of programs"; in modern language, this means that functional programs follow the [principle of compositionality](https://en.wikipedia.org/wiki/Principle_of_compositionality "Principle of compositionality").\\[ _[citation needed](https://en.wikipedia.org/wiki/Wikipedia:Citation_needed "Wikipedia:Citation needed")_\\] Backus's paper popularized research into functional programming, though it emphasized [function-level programming](https://en.wikipedia.org/wiki/Function-level_programming "Function-level programming") rather than the lambda-calculus style now associated with functional programming.
|
|
36
|
+
|
|
37
|
+
The 1973 language [ML](https://en.wikipedia.org/wiki/ML_(programming_language) "ML (programming language)") was created by [Robin Milner](https://en.wikipedia.org/wiki/Robin_Milner "Robin Milner") at the [University of Edinburgh](https://en.wikipedia.org/wiki/University_of_Edinburgh "University of Edinburgh"), and [David Turner](https://en.wikipedia.org/wiki/David_Turner_(computer_scientist) "David Turner (computer scientist)") developed the language [SASL](https://en.wikipedia.org/wiki/SASL_(programming_language) "SASL (programming language)") at the [University of St Andrews](https://en.wikipedia.org/wiki/University_of_St_Andrews "University of St Andrews"). Also in Edinburgh in the 1970s, Burstall and Darlington developed the functional language [NPL](https://en.wikipedia.org/wiki/NPL_(programming_language) "NPL (programming language)").[\\[50\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-50) NPL was based on [Kleene Recursion Equations](https://en.wikipedia.org/wiki/Kleene%27s_recursion_theorem "Kleene's recursion theorem") and was first introduced in their work on program transformation.[\\[51\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-51) Burstall, MacQueen and Sannella then incorporated the [polymorphic](https://en.wikipedia.org/wiki/Polymorphism_(computer_science) "Polymorphism (computer science)") type checking from ML to produce the language [Hope](https://en.wikipedia.org/wiki/Hope_(programming_language) "Hope (programming language)").[\\[52\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-52) ML eventually developed into several dialects, the most common of which are now [OCaml](https://en.wikipedia.org/wiki/OCaml "OCaml") and [Standard ML](https://en.wikipedia.org/wiki/Standard_ML "Standard ML").
|
|
38
|
+
|
|
39
|
+
In the 1970s, [Guy L. Steele](https://en.wikipedia.org/wiki/Guy_L._Steele "Guy L. Steele") and [Gerald Jay Sussman](https://en.wikipedia.org/wiki/Gerald_Jay_Sussman "Gerald Jay Sussman") developed [Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language) "Scheme (programming language)"), as described in the [Lambda Papers](https://en.wikipedia.org/wiki/Lambda_Papers "Lambda Papers") and the 1985 textbook _[Structure and Interpretation of Computer Programs](https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs "Structure and Interpretation of Computer Programs")_. Scheme was the first dialect of lisp to use [lexical scoping](https://en.wikipedia.org/wiki/Lexical_scope "Lexical scope") and to require [tail-call optimization](https://en.wikipedia.org/wiki/Tail-call_optimization "Tail-call optimization"), features that encourage functional programming.
|
|
40
|
+
|
|
41
|
+
In the 1980s, [Per Martin-Löf](https://en.wikipedia.org/wiki/Per_Martin-L%C3%B6f "Per Martin-Löf") developed [intuitionistic type theory](https://en.wikipedia.org/wiki/Intuitionistic_type_theory "Intuitionistic type theory") (also called _constructive_ type theory), which associated functional programs with [constructive proofs](https://en.wikipedia.org/wiki/Constructive_proof "Constructive proof") expressed as [dependent types](https://en.wikipedia.org/wiki/Dependent_type "Dependent type"). This led to new approaches to [interactive theorem proving](https://en.wikipedia.org/wiki/Interactive_theorem_proving "Interactive theorem proving") and has influenced the development of subsequent functional programming languages.\\[ _[citation needed](https://en.wikipedia.org/wiki/Wikipedia:Citation_needed "Wikipedia:Citation needed")_\\]
|
|
42
|
+
|
|
43
|
+
The lazy functional language, [Miranda](https://en.wikipedia.org/wiki/Miranda_(programming_language) "Miranda (programming language)"), developed by David Turner, initially appeared in 1985 and had a strong influence on [Haskell](https://en.wikipedia.org/wiki/Haskell "Haskell"). With Miranda being proprietary, Haskell began with a consensus in 1987 to form an [open standard](https://en.wikipedia.org/wiki/Open_standard "Open standard") for functional programming research; implementation releases have been ongoing as of 1990.
|
|
44
|
+
|
|
45
|
+
More recently it has found use in niches such as parametric [CAD](https://en.wikipedia.org/wiki/Computer_Aided_Design "Computer Aided Design") in the [OpenSCAD](https://en.wikipedia.org/wiki/OpenSCAD "OpenSCAD") language built on the [CGAL](https://en.wikipedia.org/wiki/CGAL "CGAL") framework, although its restriction on reassigning values (all values are treated as constants) has led to confusion among users who are unfamiliar with functional programming as a concept.[\\[53\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-53)
|
|
46
|
+
|
|
47
|
+
Functional programming continues to be used in commercial settings.[\\[54\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-54)[\\[55\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-55)[\\[56\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-56)
|
|
48
|
+
|
|
49
|
+
## Concepts
|
|
50
|
+
|
|
51
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=2 "Edit section: Concepts")\\]
|
|
52
|
+
|
|
53
|
+
A number of concepts[\\[57\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-57) and paradigms are specific to functional programming, and generally foreign to [imperative programming](https://en.wikipedia.org/wiki/Imperative_programming "Imperative programming") (including [object-oriented programming](https://en.wikipedia.org/wiki/Object-oriented_programming "Object-oriented programming")). However, programming languages often cater to several programming paradigms, so programmers using "mostly imperative" languages may have utilized some of these concepts.[\\[58\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-58)
|
|
54
|
+
|
|
55
|
+
### First-class and higher-order functions
|
|
56
|
+
|
|
57
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=3 "Edit section: First-class and higher-order functions")\\]
|
|
58
|
+
|
|
59
|
+
Main articles: [First-class function](https://en.wikipedia.org/wiki/First-class_function "First-class function") and [Higher-order function](https://en.wikipedia.org/wiki/Higher-order_function "Higher-order function")
|
|
60
|
+
|
|
61
|
+
[Higher-order functions](https://en.wikipedia.org/wiki/Higher-order_function "Higher-order function") are functions that can either take other functions as arguments or return them as results. In calculus, an example of a higher-order function is the [differential operator](https://en.wikipedia.org/wiki/Differential_operator "Differential operator")d/dx{\\\\displaystyle d/dx}, which returns the [derivative](https://en.wikipedia.org/wiki/Derivative "Derivative") of a function f{\\\\displaystyle f}.
|
|
62
|
+
|
|
63
|
+
Higher-order functions are closely related to [first-class functions](https://en.wikipedia.org/wiki/First-class_function "First-class function") in that higher-order functions and first-class functions both allow functions as arguments and results of other functions. The distinction between the two is subtle: "higher-order" describes a mathematical concept of functions that operate on other functions, while "first-class" is a computer science term for programming language entities that have no restriction on their use (thus first-class functions can appear anywhere in the program that other first-class entities like numbers can, including as arguments to other functions and as their return values).
|
|
64
|
+
|
|
65
|
+
Higher-order functions enable [partial application](https://en.wikipedia.org/wiki/Partial_application "Partial application") or [currying](https://en.wikipedia.org/wiki/Currying "Currying"), a technique that applies a function to its arguments one at a time, with each application returning a new function that accepts the next argument. This lets a programmer succinctly express, for example, the [successor function](https://en.wikipedia.org/wiki/Successor_function "Successor function") as the addition operator partially applied to the [natural number](https://en.wikipedia.org/wiki/Natural_number "Natural number") one.
|
|
66
|
+
|
|
67
|
+
### Pure functions
|
|
68
|
+
|
|
69
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=4 "Edit section: Pure functions")\\]
|
|
70
|
+
|
|
71
|
+
Main article: [Pure function](https://en.wikipedia.org/wiki/Pure_function "Pure function")
|
|
72
|
+
|
|
73
|
+
[Pure functions](https://en.wikipedia.org/wiki/Pure_function "Pure function") (or expressions) have no [side effects](https://en.wikipedia.org/wiki/Side_effect_(computer_science) "Side effect (computer science)") (memory or I/O). This means that pure functions have several useful properties, many of which can be used to optimize the code:
|
|
74
|
+
|
|
75
|
+
- If the result of a pure expression is not used, it can be removed without affecting other expressions.
|
|
76
|
+
- If a pure function is called with arguments that cause no side-effects, the result is constant with respect to that argument list (sometimes called [referential transparency](https://en.wikipedia.org/wiki/Referential_transparency "Referential transparency") or [idempotence](https://en.wikipedia.org/wiki/Idempotence "Idempotence")), i.e., calling the pure function again with the same arguments returns the same result. (This can enable caching optimizations such as [memoization](https://en.wikipedia.org/wiki/Memoization "Memoization").)
|
|
77
|
+
- If there is no data dependency between two pure expressions, their order can be reversed, or they can be performed in [parallel](https://en.wikipedia.org/wiki/Parallelization "Parallelization") and they cannot interfere with one another (in other terms, the evaluation of any pure expression is [thread-safe](https://en.wikipedia.org/wiki/Thread-safe "Thread-safe")).
|
|
78
|
+
- If the entire language does not allow side-effects, then any evaluation strategy can be used; this gives the compiler freedom to reorder or combine the evaluation of expressions in a program (for example, using [deforestation](https://en.wikipedia.org/wiki/Deforestation_(computer_science) "Deforestation (computer science)")).
|
|
79
|
+
|
|
80
|
+
While most compilers for imperative programming languages detect pure functions and perform common-subexpression elimination for pure function calls, they cannot always do this for pre-compiled libraries, which generally do not expose this information, thus preventing optimizations that involve those external functions. Some compilers, such as [gcc](https://en.wikipedia.org/wiki/GNU_Compiler_Collection "GNU Compiler Collection"), add extra keywords for a programmer to explicitly mark external functions as pure, to enable such optimizations. [Fortran 95](https://en.wikipedia.org/wiki/Fortran_95 "Fortran 95") also lets functions be designated _pure_.[\\[59\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-fortran95-59) C++11 added \`constexpr\` keyword with similar semantics.
|
|
81
|
+
|
|
82
|
+
### Recursion
|
|
83
|
+
|
|
84
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=5 "Edit section: Recursion")\\]
|
|
85
|
+
|
|
86
|
+
Main article: [Recursion (computer science)](https://en.wikipedia.org/wiki/Recursion_(computer_science) "Recursion (computer science)")
|
|
87
|
+
|
|
88
|
+
[Iteration](https://en.wikipedia.org/wiki/Iteration "Iteration") (looping) in functional languages is usually accomplished via [recursion](https://en.wikipedia.org/wiki/Recursion "Recursion"). [Recursive functions](https://en.wikipedia.org/wiki/Recursion_(computer_science) "Recursion (computer science)") invoke themselves, letting an operation be repeated until it reaches the [base case](https://en.wikipedia.org/wiki/Recursion_(computer_science) "Recursion (computer science)"). In general, recursion requires maintaining a [stack](https://en.wikipedia.org/wiki/Call_stack "Call stack"), which consumes space in a linear amount to the depth of recursion. This could make recursion prohibitively expensive to use instead of imperative loops. However, a special form of recursion known as [tail recursion](https://en.wikipedia.org/wiki/Tail_recursion "Tail recursion") can be recognized and optimized by a compiler into the same code used to implement iteration in imperative languages. Tail recursion optimization can be implemented by transforming the program into [continuation passing style](https://en.wikipedia.org/wiki/Continuation_passing_style "Continuation passing style") during compiling, among other approaches.
|
|
89
|
+
|
|
90
|
+
The [Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language) "Scheme (programming language)") language standard requires implementations to support proper tail recursion, meaning they must allow an unbounded number of active tail calls.[\\[60\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-SchemeProperTailRec-60)[\\[61\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-61) Proper tail recursion is not simply an optimization; it is a language feature that assures users that they can use recursion to express a loop and doing so would be safe-for-space.[\\[62\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-62) Moreover, contrary to its name, it accounts for all tail calls, not just tail recursion. While proper tail recursion is usually implemented by turning code into imperative loops, implementations might implement it in other ways. For example, [Chicken](https://en.wikipedia.org/wiki/Chicken_(Scheme_implementation) "Chicken (Scheme implementation)") intentionally maintains a stack and lets the [stack overflow](https://en.wikipedia.org/wiki/Stack_overflow "Stack overflow"). However, when this happens, its [garbage collector](https://en.wikipedia.org/wiki/Garbage_collection_(computer_science) "Garbage collection (computer science)") will claim space back,[\\[63\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-63) allowing an unbounded number of active tail calls even though it does not turn tail recursion into a loop.
|
|
91
|
+
|
|
92
|
+
Common patterns of recursion can be abstracted away using higher-order functions, with [catamorphisms](https://en.wikipedia.org/wiki/Catamorphism "Catamorphism") and [anamorphisms](https://en.wikipedia.org/wiki/Anamorphism "Anamorphism") (or "folds" and "unfolds") being the most obvious examples. Such recursion schemes play a role analogous to built-in control structures such as [loops](https://en.wikipedia.org/wiki/Program_loops "Program loops") in [imperative languages](https://en.wikipedia.org/wiki/Imperative_languages "Imperative languages").
|
|
93
|
+
|
|
94
|
+
Most general purpose functional programming languages allow unrestricted recursion and are [Turing complete](https://en.wikipedia.org/wiki/Turing_complete "Turing complete"), which makes the [halting problem](https://en.wikipedia.org/wiki/Halting_problem "Halting problem") [undecidable](https://en.wikipedia.org/wiki/Undecidable_problem "Undecidable problem"), can cause unsoundness of [equational reasoning](https://en.wikipedia.org/wiki/Equational_reasoning "Equational reasoning"), and generally requires the introduction of [inconsistency](https://en.wikipedia.org/wiki/Inconsistency "Inconsistency") into the logic expressed by the language's [type system](https://en.wikipedia.org/wiki/Type_system "Type system"). Some special purpose languages such as [Coq](https://en.wikipedia.org/wiki/Coq_(software) "Coq (software)") allow only [well-founded](https://en.wikipedia.org/wiki/Well-founded "Well-founded") recursion and are [strongly normalizing](https://en.wikipedia.org/wiki/Strongly_normalizing "Strongly normalizing") (nonterminating computations can be expressed only with infinite streams of values called [codata](https://en.wikipedia.org/wiki/Codata_(computer_science) "Codata (computer science)")). As a consequence, these languages fail to be Turing complete and expressing certain functions in them is impossible, but they can still express a wide class of interesting computations while avoiding the problems introduced by unrestricted recursion. Functional programming limited to well-founded recursion with a few other constraints is called [total functional programming](https://en.wikipedia.org/wiki/Total_functional_programming "Total functional programming").[\\[64\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-totalfp-64)
|
|
95
|
+
|
|
96
|
+
### Strict versus non-strict evaluation
|
|
97
|
+
|
|
98
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=6 "Edit section: Strict versus non-strict evaluation")\\]
|
|
99
|
+
|
|
100
|
+
Main article: [Evaluation strategy](https://en.wikipedia.org/wiki/Evaluation_strategy "Evaluation strategy")
|
|
101
|
+
|
|
102
|
+
Functional languages can be categorized by whether they use _strict (eager)_ or _non-strict (lazy)_ evaluation, concepts that refer to how function arguments are processed when an expression is being evaluated. The technical difference is in the [denotational semantics](https://en.wikipedia.org/wiki/Denotational_semantics "Denotational semantics") of expressions containing failing or divergent computations. Under strict evaluation, the evaluation of any term containing a failing subterm fails. For example, the expression:
|
|
103
|
+
|
|
104
|
+
\`\`\`
|
|
105
|
+
print length([2+1, 3*2, 1/0, 5-4])
|
|
106
|
+
|
|
107
|
+
\`\`\`
|
|
108
|
+
|
|
109
|
+
fails under strict evaluation because of the division by zero in the third element of the list. Under lazy evaluation, the length function returns the value 4 (i.e., the number of items in the list), since evaluating it does not attempt to evaluate the terms making up the list. In brief, strict evaluation always fully evaluates function arguments before invoking the function. Lazy evaluation does not evaluate function arguments unless their values are required to evaluate the function call itself.
|
|
110
|
+
|
|
111
|
+
The usual implementation strategy for lazy evaluation in functional languages is [graph reduction](https://en.wikipedia.org/wiki/Graph_reduction "Graph reduction").[\\[65\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-65) Lazy evaluation is used by default in several pure functional languages, including [Miranda](https://en.wikipedia.org/wiki/Miranda_(programming_language) "Miranda (programming language)"), [Clean](https://en.wikipedia.org/wiki/Clean_(programming_language) "Clean (programming language)"), and [Haskell](https://en.wikipedia.org/wiki/Haskell "Haskell").
|
|
112
|
+
|
|
113
|
+
[Hughes 1984](https://en.wikipedia.org/wiki/Functional_programming#CITEREFHughes1984) argues for lazy evaluation as a mechanism for improving program modularity through [separation of concerns](https://en.wikipedia.org/wiki/Separation_of_concerns "Separation of concerns"), by easing independent implementation of producers and consumers of data streams.[\\[2\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-hughesWhyFPMatters-2) Launchbury 1993 describes some difficulties that lazy evaluation introduces, particularly in analyzing a program's storage requirements, and proposes an [operational semantics](https://en.wikipedia.org/wiki/Operational_semantics "Operational semantics") to aid in such analysis.[\\[66\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-launchbury1993-66) Harper 2009 proposes including both strict and lazy evaluation in the same language, using the language's type system to distinguish them.[\\[67\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-67)
|
|
114
|
+
|
|
115
|
+
### Type systems
|
|
116
|
+
|
|
117
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=7 "Edit section: Type systems")\\]
|
|
118
|
+
|
|
119
|
+
Main article: [Type system](https://en.wikipedia.org/wiki/Type_system "Type system")
|
|
120
|
+
|
|
121
|
+
Especially since the development of [Hindley–Milner type inference](https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_inference "Hindley–Milner type inference") in the 1970s, functional programming languages have tended to use [typed lambda calculus](https://en.wikipedia.org/wiki/Typed_lambda_calculus "Typed lambda calculus"), rejecting all invalid programs at compilation time and risking [false positive errors](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_positive_error "False positives and false negatives"), as opposed to the [untyped lambda calculus](https://en.wikipedia.org/wiki/Untyped_lambda_calculus "Untyped lambda calculus"), that accepts all valid programs at compilation time and risks [false negative errors](https://en.wikipedia.org/wiki/False_positives_and_false_negatives#False_negative_error "False positives and false negatives"), used in Lisp and its variants (such as [Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language) "Scheme (programming language)")), as they reject all invalid programs at runtime when the information is enough to not reject valid programs. The use of [algebraic data types](https://en.wikipedia.org/wiki/Algebraic_data_type "Algebraic data type") makes manipulation of complex data structures convenient; the presence of strong compile-time type checking makes programs more reliable in absence of other reliability techniques like [test-driven development](https://en.wikipedia.org/wiki/Test-driven_development "Test-driven development"), while [type inference](https://en.wikipedia.org/wiki/Type_inference "Type inference") frees the programmer from the need to manually declare types to the compiler in most cases.
|
|
122
|
+
|
|
123
|
+
Some research-oriented functional languages such as [Coq](https://en.wikipedia.org/wiki/Coq_(software) "Coq (software)"), [Agda](https://en.wikipedia.org/wiki/Agda_(programming_language) "Agda (programming language)"), [Cayenne](https://en.wikipedia.org/wiki/Lennart_Augustsson "Lennart Augustsson"), and [Epigram](https://en.wikipedia.org/wiki/Epigram_(programming_language) "Epigram (programming language)") are based on [intuitionistic type theory](https://en.wikipedia.org/wiki/Intuitionistic_type_theory "Intuitionistic type theory"), which lets types depend on terms. Such types are called [dependent types](https://en.wikipedia.org/wiki/Dependent_type "Dependent type"). These type systems do not have decidable type inference and are difficult to understand and program with.[\\[68\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-68)[\\[69\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-69)[\\[70\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-70)[\\[71\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-71) But dependent types can express arbitrary propositions in [higher-order logic](https://en.wikipedia.org/wiki/Higher-order_logic "Higher-order logic"). Through the [Curry–Howard isomorphism](https://en.wikipedia.org/wiki/Curry%E2%80%93Howard_isomorphism "Curry–Howard isomorphism"), then, well-typed programs in these languages become a means of writing formal [mathematical proofs](https://en.wikipedia.org/wiki/Mathematical_proof "Mathematical proof") from which a compiler can generate [certified code](https://en.wikipedia.org/wiki/Formal_verification "Formal verification"). While these languages are mainly of interest in academic research (including in [formalized mathematics](https://en.wikipedia.org/wiki/Formalized_mathematics "Formalized mathematics")), they have begun to be used in engineering as well. [Compcert](https://en.wikipedia.org/wiki/Compcert "Compcert") is a [compiler](https://en.wikipedia.org/wiki/Compiler "Compiler") for a subset of the language [C](https://en.wikipedia.org/wiki/C_(programming_language) "C (programming language)") that is written in Coq and formally verified.[\\[72\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-72)
|
|
124
|
+
|
|
125
|
+
A limited form of dependent types called [generalized algebraic data types](https://en.wikipedia.org/wiki/Generalized_algebraic_data_type "Generalized algebraic data type") (GADT's) can be implemented in a way that provides some of the benefits of dependently typed programming while avoiding most of its inconvenience.[\\[73\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-73) GADT's are available in the [Glasgow Haskell Compiler](https://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler "Glasgow Haskell Compiler"), in [OCaml](https://en.wikipedia.org/wiki/OCaml "OCaml")[\\[74\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-74) and in [Scala](https://en.wikipedia.org/wiki/Scala_(programming_language) "Scala (programming language)"),[\\[75\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-75) and have been proposed as additions to other languages including Java and C#.[\\[76\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-76)
|
|
126
|
+
|
|
127
|
+
### Referential transparency
|
|
128
|
+
|
|
129
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=8 "Edit section: Referential transparency")\\]
|
|
130
|
+
|
|
131
|
+
Main article: [Referential transparency](https://en.wikipedia.org/wiki/Referential_transparency "Referential transparency")
|
|
132
|
+
|
|
133
|
+
Functional programs do not have assignment statements, that is, the value of a variable in a functional program never changes once defined. This eliminates any chances of side effects because any variable can be replaced with its actual value at any point of execution. So, functional programs are referentially transparent.[\\[77\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-77)
|
|
134
|
+
|
|
135
|
+
Consider [C](https://en.wikipedia.org/wiki/C_(programming_language) "C (programming language)") assignment statement \`x=x*10\`, this changes the value assigned to the variable \`x\`. Let us say that the initial value of \`x\` was \`1\`, then two consecutive evaluations of the variable \`x\` yields \`10\` and \`100\` respectively. Clearly, replacing \`x=x*10\` with either \`10\` or \`100\` gives a program a different meaning, and so the expression _is not_ referentially transparent. In fact, assignment statements are never referentially transparent.
|
|
136
|
+
|
|
137
|
+
Now, consider another function such as \`int plusone(int x) {return x+1;}\` _is_ transparent, as it does not implicitly change the input x and thus has no such [side effects](https://en.wikipedia.org/wiki/Side_effect_(computer_science) "Side effect (computer science)").
|
|
138
|
+
Functional programs exclusively use this type of function and are therefore referentially transparent.
|
|
139
|
+
|
|
140
|
+
### Data structures
|
|
141
|
+
|
|
142
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=9 "Edit section: Data structures")\\]
|
|
143
|
+
|
|
144
|
+
Main article: [Purely functional data structure](https://en.wikipedia.org/wiki/Purely_functional_data_structure "Purely functional data structure")
|
|
145
|
+
|
|
146
|
+
Purely functional [data structures](https://en.wikipedia.org/wiki/Data_structure "Data structure") are often represented in a different way to their [imperative](https://en.wikipedia.org/wiki/Imperative_programming "Imperative programming") counterparts.[\\[78\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-78) For example, the [array](https://en.wikipedia.org/wiki/Array_data_structure "Array data structure") with constant access and update times is a basic component of most imperative languages, and many imperative data-structures, such as the [hash table](https://en.wikipedia.org/wiki/Hash_table "Hash table") and [binary heap](https://en.wikipedia.org/wiki/Binary_heap "Binary heap"), are based on arrays. Arrays can be replaced by [maps](https://en.wikipedia.org/wiki/Map_(computer_science) "Map (computer science)") or random access lists, which admit purely functional implementation, but have [logarithmic](https://en.wikipedia.org/wiki/Logarithm "Logarithm") access and update times. Purely functional data structures have [persistence](https://en.wikipedia.org/wiki/Persistent_data_structure "Persistent data structure"), a property of keeping previous versions of the data structure unmodified. In Clojure, persistent data structures are used as functional alternatives to their imperative counterparts. Persistent vectors, for example, use trees for partial updating. Calling the insert method will result in some but not all nodes being created.[\\[79\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-79)
|
|
147
|
+
|
|
148
|
+
## Comparison to imperative programming
|
|
149
|
+
|
|
150
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=10 "Edit section: Comparison to imperative programming")\\]
|
|
151
|
+
|
|
152
|
+
Functional programming is very different from [imperative programming](https://en.wikipedia.org/wiki/Imperative_programming "Imperative programming"). The most significant differences stem from the fact that functional programming avoids [side effects](https://en.wikipedia.org/wiki/Side_effect_(computer_science) "Side effect (computer science)"), which are used in imperative programming to implement state and I/O. Pure functional programming completely prevents side-effects and provides referential transparency.
|
|
153
|
+
|
|
154
|
+
Higher-order functions are rarely used in older imperative programming. A traditional imperative program might use a loop to traverse and modify a list. A functional program, on the other hand, would probably use a higher-order "map" function that takes a function and a list, generating and returning a new list by applying the function to each list item.
|
|
155
|
+
|
|
156
|
+
### Imperative vs. functional programming
|
|
157
|
+
|
|
158
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=11 "Edit section: Imperative vs. functional programming")\\]
|
|
159
|
+
|
|
160
|
+
The following two examples (written in [JavaScript](https://en.wikipedia.org/wiki/JavaScript "JavaScript")) achieve the same effect: they multiply all even numbers in an array by 10 and add them all, storing the final sum in the variable \`result\`.
|
|
161
|
+
|
|
162
|
+
Traditional imperative loop:
|
|
163
|
+
|
|
164
|
+
\`\`\`
|
|
165
|
+
const numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
|
166
|
+
let result = 0;
|
|
167
|
+
for (let i = 0; i < numList.length; i++) {
|
|
168
|
+
if (numList[i] % 2 === 0) {
|
|
169
|
+
result += numList[i] * 10;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
\`\`\`
|
|
174
|
+
|
|
175
|
+
Functional programming with higher-order functions:
|
|
176
|
+
|
|
177
|
+
\`\`\`
|
|
178
|
+
const result = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
179
|
+
.filter(n => n % 2 === 0)
|
|
180
|
+
.map(a => a * 10)
|
|
181
|
+
.reduce((a, b) => a + b, 0);
|
|
182
|
+
|
|
183
|
+
\`\`\`
|
|
184
|
+
|
|
185
|
+
Sometimes the abstractions offered by functional programming might lead to development of more robust code that avoids certain issues that might arise when building upon large amount of complex, imperative code, such as [off-by-one errors](https://en.wikipedia.org/wiki/Off-by-one_error "Off-by-one error") (see [Greenspun's tenth rule](https://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule "Greenspun's tenth rule")).
|
|
186
|
+
|
|
187
|
+
### Simulating state
|
|
188
|
+
|
|
189
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=12 "Edit section: Simulating state")\\]
|
|
190
|
+
|
|
191
|
+
There are tasks (for example, maintaining a bank account balance) that often seem most naturally implemented with state. Pure functional programming performs these tasks, and I/O tasks such as accepting user input and printing to the screen, in a different way.
|
|
192
|
+
|
|
193
|
+
The pure functional programming language [Haskell](https://en.wikipedia.org/wiki/Haskell "Haskell") implements them using [monads](https://en.wikipedia.org/wiki/Monad_(functional_programming) "Monad (functional programming)"), derived from [category theory](https://en.wikipedia.org/wiki/Category_theory "Category theory").[\\[80\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-80) Monads offer a way to abstract certain types of computational patterns, including (but not limited to) modeling of computations with mutable state (and other side effects such as I/O) in an imperative manner without losing purity. While existing monads may be easy to apply in a program, given appropriate templates and examples, many students find them difficult to understand conceptually, e.g., when asked to define new monads (which is sometimes needed for certain types of libraries).[\\[81\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-81)
|
|
194
|
+
|
|
195
|
+
Functional languages also simulate states by passing around immutable states. This can be done by making a function accept the state as one of its parameters, and return a new state together with the result, leaving the old state unchanged.[\\[82\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-82)
|
|
196
|
+
|
|
197
|
+
Impure functional languages usually include a more direct method of managing mutable state. [Clojure](https://en.wikipedia.org/wiki/Clojure "Clojure"), for example, uses managed references that can be updated by applying pure functions to the current state. This kind of approach enables mutability while still promoting the use of pure functions as the preferred way to express computations.\\[ _[citation needed](https://en.wikipedia.org/wiki/Wikipedia:Citation_needed "Wikipedia:Citation needed")_\\]
|
|
198
|
+
|
|
199
|
+
Alternative methods such as [Hoare logic](https://en.wikipedia.org/wiki/Hoare_logic "Hoare logic") and [uniqueness](https://en.wikipedia.org/wiki/Uniqueness_type "Uniqueness type") have been developed to track side effects in programs. Some modern research languages use [effect systems](https://en.wikipedia.org/wiki/Effect_system "Effect system") to make the presence of side effects explicit.[\\[83\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-83)
|
|
200
|
+
|
|
201
|
+
### Efficiency issues
|
|
202
|
+
|
|
203
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=13 "Edit section: Efficiency issues")\\]
|
|
204
|
+
|
|
205
|
+
Functional programming languages are typically less efficient in their use of [CPU](https://en.wikipedia.org/wiki/Central_processing_unit "Central processing unit") and memory than imperative languages such as [C](https://en.wikipedia.org/wiki/C_(programming_language) "C (programming language)") and [Pascal](https://en.wikipedia.org/wiki/Pascal_(programming_language) "Pascal (programming language)").[\\[84\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-84) This is related to the fact that some mutable data structures like arrays have a very straightforward implementation using present hardware. Flat arrays may be accessed very efficiently with deeply pipelined CPUs, prefetched efficiently through caches (with no complex [pointer chasing](https://en.wikipedia.org/w/index.php?title=Pointer_chasing&action=edit&redlink=1 "Pointer chasing (page does not exist)")), or handled with SIMD instructions. It is also not easy to create their equally efficient general-purpose immutable counterparts. For purely functional languages, the worst-case slowdown is logarithmic in the number of memory cells used, because mutable memory can be represented by a purely functional data structure with logarithmic access time (such as a balanced tree).[\\[85\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Spiewak-85) However, such slowdowns are not universal. For programs that perform intensive numerical computations, functional languages such as [OCaml](https://en.wikipedia.org/wiki/OCaml "OCaml") and [Clean](https://en.wikipedia.org/wiki/Clean_(programming_language) "Clean (programming language)") are only slightly slower than C according to [The Computer Language Benchmarks Game](https://en.wikipedia.org/wiki/The_Computer_Language_Benchmarks_Game "The Computer Language Benchmarks Game").[\\[86\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-86) For programs that handle large [matrices](https://en.wikipedia.org/wiki/Matrix_(mathematics) "Matrix (mathematics)") and multidimensional [databases](https://en.wikipedia.org/wiki/Database "Database"), [array](https://en.wikipedia.org/wiki/Array_programming "Array programming") functional languages (such as [J](https://en.wikipedia.org/wiki/J_(programming_language) "J (programming language)") and [K](https://en.wikipedia.org/wiki/K_(programming_language) "K (programming language)")) were designed with speed optimizations.
|
|
206
|
+
|
|
207
|
+
Immutability of data can in many cases lead to execution efficiency by allowing the compiler to make assumptions that are unsafe in an imperative language, thus increasing opportunities for [inline expansion](https://en.wikipedia.org/wiki/Inline_expansion "Inline expansion").[\\[87\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-87) Even if the involved copying that may seem implicit when dealing with persistent immutable data structures might seem computationally costly, some functional programming languages, like [Clojure](https://en.wikipedia.org/wiki/Clojure "Clojure") solve this issue by implementing mechanisms for safe memory sharing between _formally_ _immutable_ data.[\\[88\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-88) [Rust](https://en.wikipedia.org/wiki/Rust_(programming_language) "Rust (programming language)") distinguishes itself by its approach to data immutability which involves immutable [references](https://en.wikipedia.org/wiki/Reference_(computer_science) "Reference (computer science)")[\\[89\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-89) and a concept called _lifetimes._[\\[90\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-90)
|
|
208
|
+
|
|
209
|
+
Immutable data with separation of identity and state and [shared-nothing](https://en.wikipedia.org/wiki/Shared-nothing_architecture "Shared-nothing architecture") schemes can also potentially be more well-suited for [concurrent and parallel](https://en.wikipedia.org/wiki/Parallel_computing "Parallel computing") programming by the virtue of reducing or eliminating the risk of certain concurrency hazards, since concurrent operations are usually [atomic](https://en.wikipedia.org/wiki/Linearizability "Linearizability") and this allows eliminating the need for locks. This is how for example \`java.util.concurrent\` classes are implemented, where some of them are immutable variants of the corresponding classes that are not suitable for concurrent use.[\\[91\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-91) Functional programming languages often have a concurrency model that instead of shared state and synchronization, leverages [message passing](https://en.wikipedia.org/wiki/Message_passing "Message passing") mechanisms (such as the [actor model](https://en.wikipedia.org/wiki/Actor_model "Actor model"), where each actor is a container for state, behavior, child actors and a message queue).[\\[92\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-92)[\\[93\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-93) This approach is common in [Erlang](https://en.wikipedia.org/wiki/Erlang_(programming_language) "Erlang (programming language)")/ [Elixir](https://en.wikipedia.org/wiki/Elixir_(programming_language) "Elixir (programming language)") or [Akka](https://en.wikipedia.org/wiki/Akka_(toolkit) "Akka (toolkit)").
|
|
210
|
+
|
|
211
|
+
[Lazy evaluation](https://en.wikipedia.org/wiki/Lazy_evaluation "Lazy evaluation") may also speed up the program, even asymptotically, whereas it may slow it down at most by a constant factor (however, it may introduce [memory leaks](https://en.wikipedia.org/wiki/Memory_leak "Memory leak") if used improperly). Launchbury 1993[\\[66\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-launchbury1993-66) discusses theoretical issues related to memory leaks from lazy evaluation, and O'Sullivan _et al._ 2008[\\[94\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-94) give some practical advice for analyzing and fixing them.
|
|
212
|
+
However, the most general implementations of lazy evaluation making extensive use of dereferenced code and data perform poorly on modern processors with deep pipelines and multi-level caches (where a cache miss may cost hundreds of cycles) \\[ _[citation needed](https://en.wikipedia.org/wiki/Wikipedia:Citation_needed "Wikipedia:Citation needed")_\\].
|
|
213
|
+
|
|
214
|
+
#### Abstraction cost
|
|
215
|
+
|
|
216
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=14 "Edit section: Abstraction cost")\\]
|
|
217
|
+
|
|
218
|
+
Some functional programming languages might not optimize abstractions such as higher order functions like " [map](https://en.wikipedia.org/wiki/Map_(higher-order_function) "Map (higher-order function)")" or " [filter](https://en.wikipedia.org/wiki/Filter_(higher-order_function) "Filter (higher-order function)")" as efficiently as the underlying imperative operations. Consider, as an example, the following two ways to check if 5 is an even number in [Clojure](https://en.wikipedia.org/wiki/Clojure "Clojure"):
|
|
219
|
+
|
|
220
|
+
\`\`\`
|
|
221
|
+
(even? 5)
|
|
222
|
+
(.equals (mod 5 2) 0)
|
|
223
|
+
|
|
224
|
+
\`\`\`
|
|
225
|
+
|
|
226
|
+
When [benchmarked](https://en.wikipedia.org/wiki/Benchmarking "Benchmarking") using the [Criterium](https://clojars.org/criterium) tool on a [Ryzen 7900X](https://en.wikipedia.org/wiki/Zen_3 "Zen 3") GNU/Linux PC in a [Leiningen](https://en.wikipedia.org/wiki/Leiningen_(software) "Leiningen (software)") [REPL](https://en.wikipedia.org/wiki/REPL "REPL") 2.11.2, running on [Java VM](https://en.wikipedia.org/wiki/JVM "JVM") version 22 and Clojure version 1.11.1, the first implementation, which is implemented as:
|
|
227
|
+
|
|
228
|
+
\`\`\`
|
|
229
|
+
(defn even?
|
|
230
|
+
"Returns true if n is even, throws an exception if n is not an integer"
|
|
231
|
+
{:added "1.0"
|
|
232
|
+
:static true}
|
|
233
|
+
[n] (if (integer? n)
|
|
234
|
+
(zero? (bit-and (clojure.lang.RT/uncheckedLongCast n) 1))
|
|
235
|
+
(throw (IllegalArgumentException. (str "Argument must be an integer: " n)))))
|
|
236
|
+
|
|
237
|
+
\`\`\`
|
|
238
|
+
|
|
239
|
+
has the mean execution time of 4.76 ms, while the second one, in which \`.equals\` is a direct invocation of the underlying [Java](https://en.wikipedia.org/wiki/Java_(programming_language) "Java (programming language)") method, has a mean execution time of 2.8 μs – roughly 1700 times faster. Part of that can be attributed to the type checking and exception handling involved in the implementation of \`even?\`. For instance the [lo library](https://github.com/samber/lo) for [Go](https://en.wikipedia.org/wiki/Go_(programming_language) "Go (programming language)"), which implements various higher-order functions common in functional programming languages using [generics](https://en.wikipedia.org/wiki/Generic_programming "Generic programming"). In a benchmark provided by the library's author, calling \`map\` is 4% slower than an equivalent \`for\` loop and has the same [allocation](https://en.wikipedia.org/wiki/Memory_management "Memory management") profile,[\\[95\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-95) which can be attributed to various compiler optimizations, such as [inlining](https://en.wikipedia.org/wiki/Inlining "Inlining").[\\[96\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-96)
|
|
240
|
+
|
|
241
|
+
One distinguishing feature of [Rust](https://en.wikipedia.org/wiki/Rust_(programming_language) "Rust (programming language)") are _zero-cost abstractions_. This means that using them imposes no additional runtime overhead. This is achieved thanks to the compiler using [loop unrolling](https://en.wikipedia.org/wiki/Loop_unrolling "Loop unrolling"), where each iteration of a loop, be it imperative or using iterators, is converted into a standalone [Assembly](https://en.wikipedia.org/wiki/Assembly_language "Assembly language") instruction, without the overhead of the loop controlling code. If an iterative operation writes to an array, the resulting array's elements [will be stored in specific CPU registers](https://en.wikipedia.org/wiki/Register_allocation "Register allocation"), allowing for [constant-time access](https://en.wikipedia.org/wiki/Time_complexity "Time complexity") at runtime.[\\[97\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-97)
|
|
242
|
+
|
|
243
|
+
### Functional programming in non-functional languages
|
|
244
|
+
|
|
245
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=15 "Edit section: Functional programming in non-functional languages")\\]
|
|
246
|
+
|
|
247
|
+
It is possible to use a functional style of programming in languages that are not traditionally considered functional languages.[\\[98\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-98) For example, both [D](https://en.wikipedia.org/wiki/D_(programming_language) "D (programming language)")[\\[99\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-99) and [Fortran 95](https://en.wikipedia.org/wiki/Fortran_95 "Fortran 95")[\\[59\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-fortran95-59) explicitly support pure functions.
|
|
248
|
+
|
|
249
|
+
[JavaScript](https://en.wikipedia.org/wiki/JavaScript "JavaScript"), [Lua](https://en.wikipedia.org/wiki/Lua_(programming_language) "Lua (programming language)"),[\\[100\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-100) [Python](https://en.wikipedia.org/wiki/Python_(programming_language) "Python (programming language)") and [Go](https://en.wikipedia.org/wiki/Go_(programming_language) "Go (programming language)")[\\[101\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-101) had [first class functions](https://en.wikipedia.org/wiki/First-class_function "First-class function") from their inception.[\\[102\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-102) Python had support for " [lambda](https://en.wikipedia.org/wiki/Anonymous_function "Anonymous function")", " [map](https://en.wikipedia.org/wiki/Map_(higher-order_function) "Map (higher-order function)")", " [reduce](https://en.wikipedia.org/wiki/Fold_(higher-order_function) "Fold (higher-order function)")", and " [filter](https://en.wikipedia.org/wiki/Filter_(higher-order_function) "Filter (higher-order function)")" in 1994, as well as closures in Python 2.2,[\\[103\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-103) though Python 3 relegated "reduce" to the \`functools\` standard library module.[\\[104\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-104) First-class functions have been introduced into other mainstream languages such as [Perl](https://en.wikipedia.org/wiki/Perl "Perl") 5.0 in 1994, [PHP](https://en.wikipedia.org/wiki/PHP "PHP") 5.3, [Visual Basic 9](https://en.wikipedia.org/wiki/Visual_Basic_9 "Visual Basic 9"), [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language) "C Sharp (programming language)") 3.0, [C++11](https://en.wikipedia.org/wiki/C%2B%2B11 "C++11"), and [Kotlin](https://en.wikipedia.org/wiki/Kotlin_(programming_language) "Kotlin (programming language)").[\\[28\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-:0-28)\\[ _[citation needed](https://en.wikipedia.org/wiki/Wikipedia:Citation_needed "Wikipedia:Citation needed")_\\]
|
|
250
|
+
|
|
251
|
+
In Perl, [lambda](https://en.wikipedia.org/wiki/Anonymous_function "Anonymous function"), [map](https://en.wikipedia.org/wiki/Map_(higher-order_function) "Map (higher-order function)"), [reduce](https://en.wikipedia.org/wiki/Fold_(higher-order_function) "Fold (higher-order function)"), [filter](https://en.wikipedia.org/wiki/Filter_(higher-order_function) "Filter (higher-order function)"), and [closures](https://en.wikipedia.org/wiki/Closure_(computer_science) "Closure (computer science)") are fully supported and frequently used. The book [Higher-Order Perl](https://en.wikipedia.org/wiki/Higher-Order_Perl "Higher-Order Perl"), released in 2005, was written to provide an expansive guide on using Perl for functional programming.
|
|
252
|
+
|
|
253
|
+
In PHP, [anonymous classes](https://en.wikipedia.org/wiki/Anonymous_class "Anonymous class"), [closures](https://en.wikipedia.org/wiki/Closure_(computer_science) "Closure (computer science)") and lambdas are fully supported. Libraries and language extensions for immutable data structures are being developed to aid programming in the functional style.
|
|
254
|
+
|
|
255
|
+
In [Java](https://en.wikipedia.org/wiki/Java_(programming_language) "Java (programming language)"), anonymous classes can sometimes be used to simulate closures;[\\[105\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-105) however, anonymous classes are not always proper replacements to closures because they have more limited capabilities.[\\[106\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-106) Java 8 supports lambda expressions as a replacement for some anonymous classes.[\\[107\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-107)
|
|
256
|
+
|
|
257
|
+
In [C#](https://en.wikipedia.org/wiki/C_Sharp_(programming_language) "C Sharp (programming language)"), anonymous classes are not necessary, because closures and lambdas are fully supported. Libraries and language extensions for immutable data structures are being developed to aid programming in the functional style in C#.
|
|
258
|
+
|
|
259
|
+
Many [object-oriented](https://en.wikipedia.org/wiki/Object-oriented "Object-oriented") [design patterns](https://en.wikipedia.org/wiki/Design_pattern_(computer_science) "Design pattern (computer science)") are expressible in functional programming terms: for example, the [strategy pattern](https://en.wikipedia.org/wiki/Strategy_pattern "Strategy pattern") simply dictates use of a higher-order function, and the [visitor](https://en.wikipedia.org/wiki/Visitor_(design_pattern) "Visitor (design pattern)") pattern roughly corresponds to a [catamorphism](https://en.wikipedia.org/wiki/Catamorphism "Catamorphism"), or [fold](https://en.wikipedia.org/wiki/Fold_(higher-order_function) "Fold (higher-order function)").
|
|
260
|
+
|
|
261
|
+
Similarly, the idea of immutable data from functional programming is often included in imperative programming languages,[\\[108\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-108) for example the tuple in Python, which is an immutable array, and Object.freeze() in JavaScript.[\\[109\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-109)
|
|
262
|
+
|
|
263
|
+
## Comparison to logic programming
|
|
264
|
+
|
|
265
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=16 "Edit section: Comparison to logic programming")\\]
|
|
266
|
+
|
|
267
|
+
[Logic programming](https://en.wikipedia.org/wiki/Logic_programming "Logic programming") can be viewed as a generalisation of functional programming, in which functions are a special case of relations.[\\[110\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-110)
|
|
268
|
+
For example, the function, mother(X) = Y, (every X has only one mother Y) can be represented by the relation mother(X, Y). Whereas functions have a strict input-output pattern of arguments, relations can be queried with any pattern of inputs and outputs. Consider the following logic program:
|
|
269
|
+
|
|
270
|
+
\`\`\`
|
|
271
|
+
mother(charles, elizabeth).
|
|
272
|
+
mother(harry, diana).
|
|
273
|
+
|
|
274
|
+
\`\`\`
|
|
275
|
+
|
|
276
|
+
The program can be queried, like a functional program, to generate mothers from children:
|
|
277
|
+
|
|
278
|
+
\`\`\`
|
|
279
|
+
?- mother(harry, X).
|
|
280
|
+
X = diana.
|
|
281
|
+
?- mother(charles, X).
|
|
282
|
+
X = elizabeth.
|
|
283
|
+
|
|
284
|
+
\`\`\`
|
|
285
|
+
|
|
286
|
+
But it can also be queried _backwards_, to generate children:
|
|
287
|
+
|
|
288
|
+
\`\`\`
|
|
289
|
+
?- mother(X, elizabeth).
|
|
290
|
+
X = charles.
|
|
291
|
+
?- mother(X, diana).
|
|
292
|
+
X = harry.
|
|
293
|
+
|
|
294
|
+
\`\`\`
|
|
295
|
+
|
|
296
|
+
It can even be used to generate all instances of the mother relation:
|
|
297
|
+
|
|
298
|
+
\`\`\`
|
|
299
|
+
?- mother(X, Y).
|
|
300
|
+
X = charles,
|
|
301
|
+
Y = elizabeth.
|
|
302
|
+
X = harry,
|
|
303
|
+
Y = diana.
|
|
304
|
+
|
|
305
|
+
\`\`\`
|
|
306
|
+
|
|
307
|
+
Compared with relational syntax, functional syntax is a more compact notation for nested functions. For example, the definition of maternal grandmother in functional syntax can be written in the nested form:
|
|
308
|
+
|
|
309
|
+
\`\`\`
|
|
310
|
+
maternal_grandmother(X) = mother(mother(X)).
|
|
311
|
+
|
|
312
|
+
\`\`\`
|
|
313
|
+
|
|
314
|
+
The same definition in relational notation needs to be written in the unnested form:
|
|
315
|
+
|
|
316
|
+
\`\`\`
|
|
317
|
+
maternal_grandmother(X, Y) :- mother(X, Z), mother(Z, Y).
|
|
318
|
+
|
|
319
|
+
\`\`\`
|
|
320
|
+
|
|
321
|
+
Here \`:-\` means _if_ and \` , \` means _and_.
|
|
322
|
+
|
|
323
|
+
However, the difference between the two representations is simply syntactic. In [Ciao](https://en.wikipedia.org/wiki/Ciao_(programming_language) "Ciao (programming language)") Prolog, relations can be nested, like functions in functional programming:[\\[111\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-111)
|
|
324
|
+
|
|
325
|
+
\`\`\`
|
|
326
|
+
grandparent(X) := parent(parent(X)).
|
|
327
|
+
parent(X) := mother(X).
|
|
328
|
+
parent(X) := father(X).
|
|
329
|
+
|
|
330
|
+
mother(charles) := elizabeth.
|
|
331
|
+
father(charles) := phillip.
|
|
332
|
+
mother(harry) := diana.
|
|
333
|
+
father(harry) := charles.
|
|
334
|
+
|
|
335
|
+
?- grandparent(X,Y).
|
|
336
|
+
X = harry,
|
|
337
|
+
Y = elizabeth.
|
|
338
|
+
X = harry,
|
|
339
|
+
Y = phillip.
|
|
340
|
+
|
|
341
|
+
\`\`\`
|
|
342
|
+
|
|
343
|
+
Ciao transforms the function-like notation into relational form and executes the resulting logic program using the standard Prolog execution strategy.
|
|
344
|
+
|
|
345
|
+
## Applications
|
|
346
|
+
|
|
347
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=17 "Edit section: Applications")\\]
|
|
348
|
+
|
|
349
|
+
### Text editors
|
|
350
|
+
|
|
351
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=18 "Edit section: Text editors")\\]
|
|
352
|
+
|
|
353
|
+
[Emacs](https://en.wikipedia.org/wiki/Emacs "Emacs"), a highly extensible text editor family uses its own [Lisp dialect](https://en.wikipedia.org/wiki/Emacs_Lisp "Emacs Lisp") for writing plugins. The original author of the most popular Emacs implementation, [GNU Emacs](https://en.wikipedia.org/wiki/GNU_Emacs "GNU Emacs") and Emacs Lisp, [Richard Stallman](https://en.wikipedia.org/wiki/Richard_Stallman "Richard Stallman") considers Lisp one of his favorite programming languages.[\\[112\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-112)
|
|
354
|
+
|
|
355
|
+
[Helix](https://en.wikipedia.org/w/index.php?title=Helix_(text_editor)&action=edit&redlink=1 "Helix (text editor) (page does not exist)"), since version 24.03 supports previewing [AST](https://en.wikipedia.org/wiki/Abstract_syntax_tree "Abstract syntax tree") as [S-expressions](https://en.wikipedia.org/wiki/S-expression "S-expression"), which are also the core feature of the Lisp programming language family.[\\[113\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-113)
|
|
356
|
+
|
|
357
|
+
### Spreadsheets
|
|
358
|
+
|
|
359
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=19 "Edit section: Spreadsheets")\\]
|
|
360
|
+
|
|
361
|
+
[Spreadsheets](https://en.wikipedia.org/wiki/Spreadsheet "Spreadsheet") can be considered a form of pure, [zeroth-order](https://en.wikipedia.org/wiki/Higher-order_function "Higher-order function"), strict-evaluation functional programming system.[\\[114\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Wakeling2007-114) However, spreadsheets generally lack higher-order functions as well as code reuse, and in some implementations, also lack recursion. Several extensions have been developed for spreadsheet programs to enable higher-order and reusable functions, but so far remain primarily academic in nature.[\\[115\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-excel-115)
|
|
362
|
+
|
|
363
|
+
### Microservices
|
|
364
|
+
|
|
365
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=20 "Edit section: Microservices")\\]
|
|
366
|
+
|
|
367
|
+
Due to their [composability](https://en.wikipedia.org/wiki/Composability "Composability"), functional programming paradigms can be suitable for [microservices](https://en.wikipedia.org/wiki/Microservices "Microservices")-based architectures.[\\[116\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-116)
|
|
368
|
+
|
|
369
|
+
### Academia
|
|
370
|
+
|
|
371
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=21 "Edit section: Academia")\\]
|
|
372
|
+
|
|
373
|
+
Functional programming is an active area of research in the field of [programming language theory](https://en.wikipedia.org/wiki/Programming_language_theory "Programming language theory"). There are several [peer-reviewed](https://en.wikipedia.org/wiki/Peer-review "Peer-review") publication venues focusing on functional programming, including the [International Conference on Functional Programming](https://en.wikipedia.org/wiki/International_Conference_on_Functional_Programming "International Conference on Functional Programming"), the [Journal of Functional Programming](https://en.wikipedia.org/wiki/Journal_of_Functional_Programming "Journal of Functional Programming"), and the [Symposium on Trends in Functional Programming](https://en.wikipedia.org/wiki/Symposium_on_Trends_in_Functional_Programming "Symposium on Trends in Functional Programming").
|
|
374
|
+
|
|
375
|
+
### Industry
|
|
376
|
+
|
|
377
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=22 "Edit section: Industry")\\]
|
|
378
|
+
|
|
379
|
+
Functional programming has been employed in a wide range of industrial applications. For example, [Erlang](https://en.wikipedia.org/wiki/Erlang_(programming_language) "Erlang (programming language)"), which was developed by the [Swedish](https://en.wikipedia.org/wiki/Sweden "Sweden") company [Ericsson](https://en.wikipedia.org/wiki/Ericsson "Ericsson") in the late 1980s, was originally used to implement [fault-tolerant](https://en.wikipedia.org/wiki/Fault_tolerance "Fault tolerance") [telecommunications](https://en.wikipedia.org/wiki/Telecommunications "Telecommunications") systems,[\\[11\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-armstrong2007-11) but has since become popular for building a range of applications at companies such as [Nortel](https://en.wikipedia.org/wiki/Nortel "Nortel"), [Facebook](https://en.wikipedia.org/wiki/Facebook "Facebook"), [Électricité de France](https://en.wikipedia.org/wiki/%C3%89lectricit%C3%A9_de_France "Électricité de France") and [WhatsApp](https://en.wikipedia.org/wiki/WhatsApp "WhatsApp").[\\[10\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-erlang-faq-10)[\\[12\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-larson2009-12)[\\[117\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-117)[\\[118\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-Sim-Diasca-118)[\\[119\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-whatsapp.blog.2012-119) [Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language) "Scheme (programming language)"), a dialect of [Lisp](https://en.wikipedia.org/wiki/Lisp_(programming_language) "Lisp (programming language)"), was used as the basis for several applications on early [Apple Macintosh](https://en.wikipedia.org/wiki/Apple_Macintosh "Apple Macintosh") computers[\\[3\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-clinger1987-3)[\\[4\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-hartheimer1987-4) and has been applied to problems such as training- [simulation software](https://en.wikipedia.org/wiki/Computer_simulation "Computer simulation")[\\[5\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-kidd2007-5) and [telescope](https://en.wikipedia.org/wiki/Telescope "Telescope") control.[\\[6\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-cleis2006-6) [OCaml](https://en.wikipedia.org/wiki/OCaml "OCaml"), which was introduced in the mid-1990s, has seen commercial use in areas such as financial analysis,[\\[14\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-minksy2008-14) [driver](https://en.wikipedia.org/wiki/Software_driver "Software driver") verification, industrial [robot](https://en.wikipedia.org/wiki/Robot "Robot") programming and static analysis of [embedded software](https://en.wikipedia.org/wiki/Embedded_software "Embedded software").[\\[15\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-leroy2007-15) [Haskell](https://en.wikipedia.org/wiki/Haskell "Haskell"), though initially intended as a research language,[\\[17\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-hudak2007-17) has also been applied in areas such as aerospace systems, hardware design and web programming.[\\[16\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-haskell-industry-16)[\\[17\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-hudak2007-17)
|
|
380
|
+
|
|
381
|
+
Other functional programming languages that have seen use in industry include [Scala](https://en.wikipedia.org/wiki/Scala_(programming_language) "Scala (programming language)"),[\\[120\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-120) [F#](https://en.wikipedia.org/wiki/F_Sharp_(programming_language) "F Sharp (programming language)"),[\\[18\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-quantFSharp-18)[\\[19\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-businessAppsFSharp-19) [Wolfram Language](https://en.wikipedia.org/wiki/Wolfram_Language "Wolfram Language"),[\\[7\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-reference.wolfram.com-7) [Lisp](https://en.wikipedia.org/wiki/Lisp_(programming_language) "Lisp (programming language)"),[\\[121\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-121) [Standard ML](https://en.wikipedia.org/wiki/Standard_ML "Standard ML")[\\[122\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-122)[\\[123\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-123) and Clojure.[\\[124\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-124) Scala has been widely used in [Data science](https://en.wikipedia.org/wiki/Data_science "Data science"),[\\[125\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-125) while [ClojureScript](https://en.wikipedia.org/wiki/ClojureScript "ClojureScript"),[\\[126\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-126) [Elm](https://en.wikipedia.org/wiki/Elm_(programming_language) "Elm (programming language)")[\\[127\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-127) or [PureScript](https://en.wikipedia.org/wiki/PureScript "PureScript")[\\[128\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-128) are some of the functional frontend programming languages used in production. [Elixir](https://en.wikipedia.org/wiki/Elixir_(programming_language) "Elixir (programming language)")'s Phoenix framework is also used by some relatively popular commercial projects, such as [Font Awesome](https://en.wikipedia.org/wiki/Font_Awesome "Font Awesome") or [Allegro](https://en.wikipedia.org/wiki/Allegro_Platform "Allegro Platform") (one of the biggest e-commerce platforms in Poland)[\\[129\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-129)'s classified ads platform _Allegro Lokalnie._[\\[130\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-130)
|
|
382
|
+
|
|
383
|
+
Functional "platforms" have been popular in finance for risk analytics (particularly with large investment banks). Risk factors are coded as functions that form interdependent graphs (categories) to measure correlations in market shifts, similar in manner to [Gröbner basis](https://en.wikipedia.org/wiki/Gr%C3%B6bner_basis "Gröbner basis") optimizations but also for regulatory frameworks such as [Comprehensive Capital Analysis and Review](https://en.wikipedia.org/wiki/Comprehensive_Capital_Analysis_and_Review "Comprehensive Capital Analysis and Review"). Given the use of OCaml and [Caml](https://en.wikipedia.org/wiki/Caml "Caml") variations in finance, these systems are sometimes considered related to a [categorical abstract machine](https://en.wikipedia.org/wiki/Categorical_abstract_machine "Categorical abstract machine"). Functional programming is heavily influenced by [category theory](https://en.wikipedia.org/wiki/Category_theory "Category theory").\\[ _[citation needed](https://en.wikipedia.org/wiki/Wikipedia:Citation_needed "Wikipedia:Citation needed")_\\]
|
|
384
|
+
|
|
385
|
+
### Education
|
|
386
|
+
|
|
387
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=23 "Edit section: Education")\\]
|
|
388
|
+
|
|
389
|
+
Many [universities](https://en.wikipedia.org/wiki/University "University") teach functional programming.[\\[131\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-oxfordFP-131)[\\[132\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-imperialFP-132)[\\[133\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-nottinghamFP-133)[\\[134\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-mitFP-134) Some treat it as an introductory programming concept[\\[134\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-mitFP-134) while others first teach imperative programming methods.[\\[133\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-nottinghamFP-133)[\\[135\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-61A-135)
|
|
390
|
+
|
|
391
|
+
Outside of computer science, functional programming is used to teach problem-solving, algebraic and geometric concepts.[\\[136\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-bootstrapworld-136) It has also been used to teach classical mechanics, as in the book _[Structure and Interpretation of Classical Mechanics](https://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Classical_Mechanics "Structure and Interpretation of Classical Mechanics")_.
|
|
392
|
+
|
|
393
|
+
In particular, [Scheme](https://en.wikipedia.org/wiki/Scheme_(programming_language) "Scheme (programming language)") has been a relatively popular choice for teaching programming for years.[\\[137\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-137)[\\[138\\]](https://en.wikipedia.org/wiki/Functional_programming#cite_note-138)
|
|
394
|
+
|
|
395
|
+
## See also
|
|
396
|
+
|
|
397
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=24 "Edit section: See also")\\]
|
|
398
|
+
|
|
399
|
+
- [](https://en.wikipedia.org/wiki/File:Octicons-terminal.svg)[Computer programming portal](https://en.wikipedia.org/wiki/Portal:Computer_programming "Portal:Computer programming")
|
|
400
|
+
|
|
401
|
+
- [Eager evaluation](https://en.wikipedia.org/wiki/Eager_evaluation "Eager evaluation")
|
|
402
|
+
- [Functional reactive programming](https://en.wikipedia.org/wiki/Functional_reactive_programming "Functional reactive programming")
|
|
403
|
+
- [Inductive functional programming](https://en.wikipedia.org/wiki/Inductive_functional_programming "Inductive functional programming")
|
|
404
|
+
- [List of functional programming languages](https://en.wikipedia.org/wiki/List_of_functional_programming_languages "List of functional programming languages")
|
|
405
|
+
- [List of functional programming topics](https://en.wikipedia.org/wiki/List_of_functional_programming_topics "List of functional programming topics")
|
|
406
|
+
- [Nested function](https://en.wikipedia.org/wiki/Nested_function "Nested function")
|
|
407
|
+
- [Purely functional programming](https://en.wikipedia.org/wiki/Purely_functional_programming "Purely functional programming")
|
|
408
|
+
|
|
409
|
+
## Notes and references
|
|
410
|
+
|
|
411
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=25 "Edit section: Notes and references")\\]
|
|
412
|
+
|
|
413
|
+
001. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-hudak1989_1-0 "Jump up")**[Hudak, Paul](https://en.wikipedia.org/wiki/Paul_Hudak "Paul Hudak") (September 1989). ["Conception, evolution, and application of functional programming languages"](https://web.archive.org/web/20160131083528/http://www.dbnet.ece.ntua.gr/~adamo/languages/books/p359-hudak.pdf)(PDF). _ACM Computing Surveys_. **21** (3): 359–411\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1145/72551.72554](https://doi.org/10.1145%2F72551.72554). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [207637854](https://api.semanticscholar.org/CorpusID:207637854). Archived from [the original](http://www.dbnet.ece.ntua.gr/~adamo/languages/books/p359-hudak.pdf)(PDF) on 2016-01-31. Retrieved 2013-08-10.
|
|
414
|
+
002. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-hughesWhyFPMatters_2-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-hughesWhyFPMatters_2-1)[Hughes, John](https://en.wikipedia.org/wiki/John_Hughes_(computer_scientist) "John Hughes (computer scientist)") (1984). ["Why Functional Programming Matters"](http://www.cse.chalmers.se/~rjmh/Papers/whyfp.html).
|
|
415
|
+
003. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-clinger1987_3-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-clinger1987_3-1)Clinger, Will (1987). ["MultiTasking and MacScheme"](http://www.mactech.com/articles/mactech/Vol.03/03.12/Multitasking/index.html). _MacTech_. **3** (12). Retrieved 2008-08-28.
|
|
416
|
+
004. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-hartheimer1987_4-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-hartheimer1987_4-1)Hartheimer, Anne (1987). ["Programming a Text Editor in MacScheme+Toolsmith"](https://web.archive.org/web/20110629183752/http://www.mactech.com/articles/mactech/Vol.03/03.1/SchemeWindows/index.html). _MacTech_. **3** (1). Archived from [the original](http://www.mactech.com/articles/mactech/Vol.03/03.1/SchemeWindows/index.html) on 2011-06-29. Retrieved 2008-08-28.
|
|
417
|
+
005. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-kidd2007_5-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-kidd2007_5-1)Kidd, Eric. [_Terrorism Response Training in Scheme_](https://web.archive.org/web/20101221110947/http://cufp.galois.com/2007/abstracts.html#EricKidd). CUFP 2007. Archived from [the original](http://cufp.galois.com/2007/abstracts.html#EricKidd) on 2010-12-21. Retrieved 2009-08-26.
|
|
418
|
+
006. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-cleis2006_6-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-cleis2006_6-1)Cleis, Richard. [_Scheme in Space_](https://web.archive.org/web/20100527100429/http://cufp.galois.com/2006/abstracts.html#RichardCleis). CUFP 2006. Archived from [the original](http://cufp.galois.com/2006/abstracts.html#RichardCleis) on 2010-05-27. Retrieved 2009-08-26.
|
|
419
|
+
007. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-reference.wolfram.com_7-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-reference.wolfram.com_7-1)["Wolfram Language Guide: Functional Programming"](http://reference.wolfram.com/language/guide/FunctionalProgramming.html). 2015. Retrieved 2015-08-24.
|
|
420
|
+
008. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Amath-CO_8-0 "Jump up")**["Functional vs. Procedural Programming Language"](https://web.archive.org/web/20071113175801/http://amath.colorado.edu/computing/mmm/funcproc.html). _Department of Applied Math_. University of Colorado. Archived from [the original](http://amath.colorado.edu/computing/mmm/funcproc.html) on 2007-11-13. Retrieved 2006-08-28.
|
|
421
|
+
009. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-racket-video-games_9-0 "Jump up")**["State-Based Scripting in Uncharted 2"](https://web.archive.org/web/20121215014637/http://www.gameenginebook.com/gdc09-statescripting-uncharted2.pdf)(PDF). Archived from [the original](http://www.gameenginebook.com/gdc09-statescripting-uncharted2.pdf)(PDF) on 2012-12-15. Retrieved 2011-08-08.
|
|
422
|
+
010. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-erlang-faq_10-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-erlang-faq_10-1)["Who uses Erlang for product development?"](http://erlang.org/faq/introduction.html#idp32582608). _Frequently asked questions about Erlang_. Retrieved 2018-04-27.
|
|
423
|
+
011. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-armstrong2007_11-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-armstrong2007_11-1)Armstrong, Joe (June 2007). "A history of Erlang". _Proceedings of the third ACM SIGPLAN conference on History of programming languages_. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1145/1238844.1238850](https://doi.org/10.1145%2F1238844.1238850). [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [9781595937667](https://en.wikipedia.org/wiki/Special:BookSources/9781595937667 "Special:BookSources/9781595937667").
|
|
424
|
+
012. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-larson2009_12-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-larson2009_12-1)Larson, Jim (March 2009). ["Erlang for concurrent programming"](https://doi.org/10.1145%2F1467247.1467263). _Communications of the ACM_. **52** (3): 48. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1145/1467247.1467263](https://doi.org/10.1145%2F1467247.1467263). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [524392](https://api.semanticscholar.org/CorpusID:524392).
|
|
425
|
+
013. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-13 "Jump up")**["The Elixir Programming Language"](https://elixir-lang.org/). Retrieved 2021-02-14.
|
|
426
|
+
014. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-minksy2008_14-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-minksy2008_14-1)Minsky, Yaron; Weeks, Stephen (July 2008). "Caml Trading — experiences with functional programming on Wall Street". _Journal of Functional Programming_. **18** (4): 553–564\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1017/S095679680800676X](https://doi.org/10.1017%2FS095679680800676X) (inactive 1 November 2024). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [30955392](https://api.semanticscholar.org/CorpusID:30955392).\`{{cite journal}}\`: CS1 maint: DOI inactive as of November 2024 ( [link](https://en.wikipedia.org/wiki/Category:CS1_maint:_DOI_inactive_as_of_November_2024 "Category:CS1 maint: DOI inactive as of November 2024"))
|
|
427
|
+
015. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-leroy2007_15-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-leroy2007_15-1)Leroy, Xavier. [_Some uses of Caml in Industry_](https://web.archive.org/web/20111008170929/http://cufp.galois.com/2007/slides/XavierLeroy.pdf)(PDF). CUFP 2007. Archived from [the original](http://cufp.galois.com/2007/slides/XavierLeroy.pdf)(PDF) on 2011-10-08. Retrieved 2009-08-26.
|
|
428
|
+
016. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-haskell-industry_16-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-haskell-industry_16-1)["Haskell in industry"](http://www.haskell.org/haskellwiki/Haskell_in_industry). _Haskell Wiki_. Retrieved 2009-08-26. Haskell has a diverse range of use commercially, from aerospace and defense, to finance, to web startups, hardware design firms and lawnmower manufacturers.
|
|
429
|
+
017. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-hudak2007_17-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-hudak2007_17-1) [_**c**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-hudak2007_17-2)[Hudak, Paul](https://en.wikipedia.org/wiki/Paul_Hudak "Paul Hudak"); Hughes, J.; Jones, S. P.; Wadler, P. (June 2007). [_A history of Haskell: being lazy with class_](http://dl.acm.org/citation.cfm?doid=1238844.1238856). Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1145/1238844.1238856](https://doi.org/10.1145%2F1238844.1238856). Retrieved 2013-09-26.
|
|
430
|
+
018. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-quantFSharp_18-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-quantFSharp_18-1)Mansell, Howard (2008). [_Quantitative Finance in F#_](https://web.archive.org/web/20150708125937/http://cufp.galois.com/2008/abstracts.html#MansellHoward). CUFP 2008. Archived from [the original](http://cufp.galois.com/2008/abstracts.html#MansellHoward) on 2015-07-08. Retrieved 2009-08-29.
|
|
431
|
+
019. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-businessAppsFSharp_19-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-businessAppsFSharp_19-1)Peake, Alex (2009). [_The First Substantial Line of Business Application in F#_](https://web.archive.org/web/20091017070140/http://cufp.galois.com/2009/abstracts.html#AlexPeakeAdamGranicz). CUFP 2009. Archived from [the original](http://cufp.galois.com/2009/abstracts.html#AlexPeakeAdamGranicz) on 2009-10-17. Retrieved 2009-08-29.
|
|
432
|
+
020. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-20 "Jump up")**de Moura, Leonardo; Ullrich, Sebastian (July 2021). "The Lean 4 Theorem Prover and Programming Language". _Lecture Notes in Artificial Intelligence_. Conference on Automated Deduction. Vol. 12699. pp. 625–635\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1007/978-3-030-79876-5\\_37](https://doi.org/10.1007%2F978-3-030-79876-5_37). [ISSN](https://en.wikipedia.org/wiki/ISSN_(identifier) "ISSN (identifier)") [1611-3349](https://search.worldcat.org/issn/1611-3349).
|
|
433
|
+
021. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-21 "Jump up")**Banz, Matt (2017-06-27). ["An introduction to functional programming in JavaScript"](https://opensource.com/article/17/6/functional-javascript). _Opensource.com_. Retrieved 2021-01-09.
|
|
434
|
+
022. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-useR_22-0 "Jump up")**["The useR! 2006 conference schedule includes papers on the commercial use of R"](http://www.r-project.org/useR-2006/program.html). R-project.org. 2006-06-08. Retrieved 2011-06-20.
|
|
435
|
+
023. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Chambers_23-0 "Jump up")**[Chambers, John M.](https://en.wikipedia.org/wiki/John_Chambers_(programmer) "John Chambers (programmer)") (1998). _Programming with Data: A Guide to the S Language_. Springer Verlag. pp. 67–70\\. [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-0-387-98503-9](https://en.wikipedia.org/wiki/Special:BookSources/978-0-387-98503-9 "Special:BookSources/978-0-387-98503-9").
|
|
436
|
+
024. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Novatchev_24-0 "Jump up")**Novatchev, Dimitre. ["The Functional Programming Language XSLT — A proof through examples"](http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html). Retrieved May 27, 2006.
|
|
437
|
+
025. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Mertz_25-0 "Jump up")**Mertz, David. ["XML Programming Paradigms (part four): Functional Programming approached to XML processing"](http://gnosis.cx/publish/programming/xml_models_fp.html). _IBM developerWorks_. Retrieved May 27, 2006.
|
|
438
|
+
026. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Chamberlin_Boyce_26-0 "Jump up")**[Chamberlin, Donald D.](https://en.wikipedia.org/wiki/Donald_D._Chamberlin "Donald D. Chamberlin"); [Boyce, Raymond F.](https://en.wikipedia.org/wiki/Raymond_F._Boyce "Raymond F. Boyce") (1974). "SEQUEL: A structured English query language". _Proceedings of the 1974 ACM SIGFIDET_: 249–264.
|
|
439
|
+
027. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-27 "Jump up")**[_Functional Programming with C# - Simon Painter - NDC Oslo 2020_](https://ghostarchive.org/varchive/youtube/20211030/gvyTB4aMI4o), 8 August 2021, archived from [the original](https://www.youtube.com/watch?v=gvyTB4aMI4o) on 2021-10-30, retrieved 2021-10-23
|
|
440
|
+
028. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-:0_28-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-:0_28-1)["Functional programming - Kotlin Programming Language"](https://kotlinlang.org/docs/tutorials/kotlin-for-py/functional-programming.html). _Kotlin_. Retrieved 2019-05-01.
|
|
441
|
+
029. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-29 "Jump up")**[Dominus, Mark J.](https://en.wikipedia.org/wiki/Mark_Jason_Dominus "Mark Jason Dominus") (2005). [_Higher-Order Perl_](https://en.wikipedia.org/wiki/Higher-Order_Perl "Higher-Order Perl"). [Morgan Kaufmann](https://en.wikipedia.org/wiki/Morgan_Kaufmann "Morgan Kaufmann"). [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-1-55860-701-9](https://en.wikipedia.org/wiki/Special:BookSources/978-1-55860-701-9 "Special:BookSources/978-1-55860-701-9").
|
|
442
|
+
030. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-30 "Jump up")**Holywell, Simon (2014). _Functional Programming in PHP_. php\\[architect\\]. [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [9781940111056](https://en.wikipedia.org/wiki/Special:BookSources/9781940111056 "Special:BookSources/9781940111056").
|
|
443
|
+
031. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-AutoNT-13_31-0 "Jump up")**The Cain Gang Ltd. ["Python Metaclasses: Who? Why? When?"](https://web.archive.org/web/20090530030205/http://www.python.org/community/pycon/dc2004/papers/24/metaclasses-pycon.pdf)(PDF). Archived from [the original](https://www.python.org/community/pycon/dc2004/papers/24/metaclasses-pycon.pdf)(PDF) on 30 May 2009. Retrieved 27 June 2009.
|
|
444
|
+
032. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-32 "Jump up")**["GopherCon 2020: Dylan Meeus - Functional Programming with Go"](https://www.youtube.com/watch?v=wqs8n5Uk5OM). _YouTube_. 22 December 2020.
|
|
445
|
+
033. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-33 "Jump up")**["Functional Language Features: Iterators and Closures - The Rust Programming Language"](https://doc.rust-lang.org/book/ch13-00-functional-features.html). _doc.rust-lang.org_. Retrieved 2021-01-09.
|
|
446
|
+
034. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-34 "Jump up")**Vanderbauwhede, Wim (18 July 2020). ["Cleaner code with functional programming"](https://web.archive.org/web/20200728013926/https://wimvanderbauwhede.github.io/articles/decluttering-with-functional-programming/). Archived from [the original](https://wimvanderbauwhede.github.io/articles/decluttering-with-functional-programming/) on 28 July 2020. Retrieved 6 October 2020.
|
|
447
|
+
035. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-effective-scala_35-0 "Jump up")**["Effective Scala"](https://web.archive.org/web/20120619075044/http://twitter.github.com/effectivescala/?sd). _Scala Wiki_. Archived from [the original](https://twitter.github.com/effectivescala/?sd) on 2012-06-19. Retrieved 2012-02-21. Effective Scala.
|
|
448
|
+
036. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-java-8-javadoc_36-0 "Jump up")**["Documentation for package java.util.function since Java 8 (also known as Java 1.8)"](https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html). Retrieved 2021-06-16.
|
|
449
|
+
037. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-37 "Jump up")**Turing, A. M. (1937). "Computability and λ-definability". _The Journal of Symbolic Logic_. **2** (4). Cambridge University Press: 153–163\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.2307/2268280](https://doi.org/10.2307%2F2268280). [JSTOR](https://en.wikipedia.org/wiki/JSTOR_(identifier) "JSTOR (identifier)") [2268280](https://www.jstor.org/stable/2268280). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [2317046](https://api.semanticscholar.org/CorpusID:2317046).
|
|
450
|
+
038. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-38 "Jump up")**Haskell Brooks Curry; Robert Feys (1958). [_Combinatory Logic_](https://archive.org/details/combinatorylogic0002curr). North-Holland Publishing Company. Retrieved 10 February 2013.
|
|
451
|
+
039. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-39 "Jump up")**[Church, A.](https://en.wikipedia.org/wiki/Alonzo_Church "Alonzo Church") (1940). "A Formulation of the Simple Theory of Types". _Journal of Symbolic Logic_. **5** (2): 56–68\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.2307/2266170](https://doi.org/10.2307%2F2266170). [JSTOR](https://en.wikipedia.org/wiki/JSTOR_(identifier) "JSTOR (identifier)") [2266170](https://www.jstor.org/stable/2266170). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [15889861](https://api.semanticscholar.org/CorpusID:15889861).
|
|
452
|
+
040. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-40 "Jump up")**[McCarthy, John](https://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist) "John McCarthy (computer scientist)") (June 1978). [_History of Lisp_](http://jmc.stanford.edu/articles/lisp/lisp.pdf)(PDF). _History of Programming Languages_. Los Angeles, CA. pp. 173–185\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1145/800025.808387](https://doi.org/10.1145%2F800025.808387).
|
|
453
|
+
041. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-41 "Jump up")**[John McCarthy](https://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist) "John McCarthy (computer scientist)") (1960). ["Recursive functions of symbolic expressions and their computation by machine, Part I."](http://jmc.stanford.edu/articles/recursive/recursive.pdf)(PDF). _Communications of the ACM_. **3** (4). ACM New York, NY, US: 184–195\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1145/367177.367199](https://doi.org/10.1145%2F367177.367199). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [1489409](https://api.semanticscholar.org/CorpusID:1489409).
|
|
454
|
+
042. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-42 "Jump up")**Guy L. Steele; Richard P. Gabriel (February 1996). "The evolution of Lisp". [_History of programming languages---II_](http://dreamsongs.com/Files/HOPL2-Uncut.pdf)(PDF). pp. 233–330\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1145/234286.1057818](https://doi.org/10.1145%2F234286.1057818). [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-0-201-89502-5](https://en.wikipedia.org/wiki/Special:BookSources/978-0-201-89502-5 "Special:BookSources/978-0-201-89502-5"). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [47047140](https://api.semanticscholar.org/CorpusID:47047140).
|
|
455
|
+
043. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-43 "Jump up")**The memoir of [Herbert A. Simon](https://en.wikipedia.org/wiki/Herbert_A._Simon "Herbert A. Simon") (1991), _Models of My Life_ pp.189-190 [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [0-465-04640-1](https://en.wikipedia.org/wiki/Special:BookSources/0-465-04640-1 "Special:BookSources/0-465-04640-1") claims that he, Al Newell, and Cliff Shaw are "...commonly adjudged to be the parents of \\[the\\] artificial intelligence \\[field\\]," for writing [Logic Theorist](https://en.wikipedia.org/wiki/Logic_Theorist "Logic Theorist"), a program that proved theorems from _[Principia Mathematica](https://en.wikipedia.org/wiki/Principia_Mathematica "Principia Mathematica")_ automatically. To accomplish this, they had to invent a language and a paradigm that, viewed retrospectively, embeds functional programming.
|
|
456
|
+
044. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-44 "Jump up")**Landin, Peter J. (1964). ["The mechanical evaluation of expressions"](https://doi.org/10.1093%2Fcomjnl%2F6.4.308). _[The Computer Journal](https://en.wikipedia.org/wiki/The_Computer_Journal "The Computer Journal")_. **6** (4). [British Computer Society](https://en.wikipedia.org/wiki/British_Computer_Society "British Computer Society"): 308–320\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1093/comjnl/6.4.308](https://doi.org/10.1093%2Fcomjnl%2F6.4.308).
|
|
457
|
+
045. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-45 "Jump up")**Diehl, Stephan; Hartel, Pieter; Sestoft, Peter (2000). "Abstract machines for programming language implementation". _Future Generation Computer Systems_. Vol. 16. pp. 739–751.
|
|
458
|
+
046. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-46 "Jump up")**Landin, Peter J. (February 1965a). ["Correspondence between ALGOL 60 and Church's Lambda-notation: part I"](https://doi.org/10.1145%2F363744.363749). _[Communications of the ACM](https://en.wikipedia.org/wiki/Communications_of_the_ACM "Communications of the ACM")_. **8** (2). [Association for Computing Machinery](https://en.wikipedia.org/wiki/Association_for_Computing_Machinery "Association for Computing Machinery"): 89–101\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1145/363744.363749](https://doi.org/10.1145%2F363744.363749). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [6505810](https://api.semanticscholar.org/CorpusID:6505810).
|
|
459
|
+
047. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-47 "Jump up")**Landin, Peter J. (March 1965b). ["A correspondence between ALGOL 60 and Church's Lambda-notation: part II"](https://doi.org/10.1145%2F363791.363804). _[Communications of the ACM](https://en.wikipedia.org/wiki/Communications_of_the_ACM "Communications of the ACM")_. **8** (3). [Association for Computing Machinery](https://en.wikipedia.org/wiki/Association_for_Computing_Machinery "Association for Computing Machinery"): 158–165\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1145/363791.363804](https://doi.org/10.1145%2F363791.363804). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [15781851](https://api.semanticscholar.org/CorpusID:15781851).
|
|
460
|
+
048. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-48 "Jump up")**Landin, Peter J. (March 1966b). ["The next 700 programming languages"](https://doi.org/10.1145%2F365230.365257). _[Communications of the ACM](https://en.wikipedia.org/wiki/Communications_of_the_ACM "Communications of the ACM")_. **9** (3). [Association for Computing Machinery](https://en.wikipedia.org/wiki/Association_for_Computing_Machinery "Association for Computing Machinery"): 157–166\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1145/365230.365257](https://doi.org/10.1145%2F365230.365257). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [13409665](https://api.semanticscholar.org/CorpusID:13409665).
|
|
461
|
+
049. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Backus_1977_49-0 "Jump up")**Backus, J. (1978). ["Can programming be liberated from the von Neumann style?: A functional style and its algebra of programs"](https://doi.org/10.1145%2F359576.359579). _Communications of the ACM_. **21** (8): 613–641\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1145/359576.359579](https://doi.org/10.1145%2F359576.359579).
|
|
462
|
+
050. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-50 "Jump up")**R.M. Burstall. Design considerations for a functional programming language. Invited paper, Proc. Infotech State of the Art Conf. "The Software Revolution", Copenhagen, 45–57 (1977)
|
|
463
|
+
051. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-51 "Jump up")**R.M. Burstall and J. Darlington. A transformation system for developing recursive programs. Journal of the Association for Computing Machinery 24(1):44–67 (1977)
|
|
464
|
+
052. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-52 "Jump up")**R.M. Burstall, D.B. MacQueen and D.T. Sannella. HOPE: an experimental applicative language. Proceedings 1980 LISP Conference, Stanford, 136–143 (1980).
|
|
465
|
+
053. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-53 "Jump up")**["Make discovering assign() easier!"](https://web.archive.org/web/20230419060430/https://forum.openscad.org/Make-discovering-assign-easier-td10964.html). _OpenSCAD_. Archived from [the original](https://forum.openscad.org/Make-discovering-assign-easier-td10964.html) on 2023-04-19.
|
|
466
|
+
054. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-54 "Jump up")**Peter Bright (March 13, 2018). ["Developers love trendy new languages but earn more with functional programming"](https://arstechnica.com/gadgets/2018/03/developers-love-trendy-new-languages-but-earn-more-with-functional-programming/). _[Ars Technica](https://en.wikipedia.org/wiki/Ars_Technica "Ars Technica")_.
|
|
467
|
+
055. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-55 "Jump up")**John Leonard (January 24, 2017). ["The stealthy rise of functional programming"](https://www.computing.co.uk/ctg/analysis/3003123/the-slow-but-steady-rise-of-functional-programming). Computing.
|
|
468
|
+
056. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-56 "Jump up")**Leo Cheung (May 9, 2017). ["Is functional programming better for your startup?"](https://www.infoworld.com/article/3190185/software/is-functional-programming-better-for-your-startup.html). _[InfoWorld](https://en.wikipedia.org/wiki/InfoWorld "InfoWorld")_.
|
|
469
|
+
057. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-57 "Jump up")**Sean Tull - Monoidal Categories for Formal Concept Analysis.
|
|
470
|
+
058. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-58 "Jump up")**Pountain, Dick. ["Functional Programming Comes of Age"](https://web.archive.org/web/20060827094123/http://byte.com/art/9408/sec11/art1.htm). _[Byte](https://en.wikipedia.org/wiki/Byte_(magazine) "Byte (magazine)") (August 1994)_. Archived from [the original](http://byte.com/art/9408/sec11/art1.htm) on 2006-08-27. Retrieved August 31, 2006.
|
|
471
|
+
059. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-fortran95_59-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-fortran95_59-1)["ISO/IEC JTC 1/SC 22/WG5/N2137 – Fortran 2015 Committee Draft (J3/17-007r2)"](https://wg5-fortran.org/N2101-N2150/N2137.pdf)(PDF). International Organization for Standardization. July 6, 2017. pp. 336–338.
|
|
472
|
+
060. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-SchemeProperTailRec_60-0 "Jump up")**["Revised^6 Report on the Algorithmic Language Scheme"](http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-8.html#node_sec_5.11). R6rs.org. Retrieved 2013-03-21.
|
|
473
|
+
061. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-61 "Jump up")**["Revised^6 Report on the Algorithmic Language Scheme - Rationale"](http://www.r6rs.org/final/html/r6rs-rationale/r6rs-rationale-Z-H-7.html#node_sec_5.3). R6rs.org. Retrieved 2013-03-21.
|
|
474
|
+
062. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-62 "Jump up")**Clinger, William (1998). "Proper tail recursion and space efficiency". _Proceedings of the ACM SIGPLAN 1998 conference on Programming language design and implementation - PLDI '98_. pp. 174–185\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1145/277650.277719](https://doi.org/10.1145%2F277650.277719). [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [0897919874](https://en.wikipedia.org/wiki/Special:BookSources/0897919874 "Special:BookSources/0897919874"). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [16812984](https://api.semanticscholar.org/CorpusID:16812984).
|
|
475
|
+
063. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-63 "Jump up")**Baker, Henry (1994). ["CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A."](https://web.archive.org/web/20060303155622/http://home.pipeline.com/~hbaker1/CheneyMTA.html) Archived from [the original](http://home.pipeline.com/~hbaker1/CheneyMTA.html) on 2006-03-03. Retrieved 2020-04-29.
|
|
476
|
+
064. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-totalfp_64-0 "Jump up")**[Turner, D.A.](https://en.wikipedia.org/wiki/David_Turner_(computer_scientist) "David Turner (computer scientist)") (2004-07-28). ["Total Functional Programming"](http://www.jucs.org/jucs_10_7/total_functional_programming). _Journal of Universal Computer Science_. **10** (7): 751–768\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.3217/jucs-010-07-0751](https://doi.org/10.3217%2Fjucs-010-07-0751).
|
|
477
|
+
065. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-65 "Jump up")**[The Implementation of Functional Programming Languages](http://research.microsoft.com/~simonpj/papers/slpj-book-1987/index.htm). Simon Peyton Jones, published by Prentice Hall, 1987
|
|
478
|
+
066. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-launchbury1993_66-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-launchbury1993_66-1)[Launchbury, John](https://en.wikipedia.org/wiki/John_Launchbury "John Launchbury") (March 1993). _A Natural Semantics for Lazy Evaluation_. Symposium on Principles of Programming Languages. Charleston, South Carolina: [ACM](https://en.wikipedia.org/wiki/Association_for_Computing_Machinery "Association for Computing Machinery"). pp. 144–154\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"):[10.1145/158511.158618](https://doi.org/10.1145%2F158511.158618).
|
|
479
|
+
067. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-67 "Jump up")**[Robert W. Harper](https://en.wikipedia.org/wiki/Robert_Harper_(computer_scientist) "Robert Harper (computer scientist)") (2009). [_Practical Foundations for Programming Languages_](https://web.archive.org/web/20160407095249/https://www.cs.cmu.edu/~rwh/plbook/book.pdf)(PDF). Archived from [the original](https://www.cs.cmu.edu/~rwh/plbook/book.pdf)(PDF) on 2016-04-07.
|
|
480
|
+
068. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-68 "Jump up")**Huet, Gérard P. (1973). "The Undecidability of Unification in Third Order Logic". _Information and Control_. **22** (3): 257–267\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1016/s0019-9958(73)90301-x](https://doi.org/10.1016%2Fs0019-9958%2873%2990301-x).
|
|
481
|
+
069. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-69 "Jump up")**Huet, Gérard (Sep 1976). _Resolution d'Equations dans des Langages d'Ordre 1,2,...ω_ (Ph.D.) (in French). Universite de Paris VII.
|
|
482
|
+
070. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-70 "Jump up")**Huet, Gérard (2002). ["Higher Order Unification 30 years later"](http://pauillac.inria.fr/~huet/PUBLIC/Hampton.pdf)(PDF). In Carreño, V.; Muñoz, C.; Tahar, S. (eds.). _Proceedings, 15th International Conference TPHOL_. LNCS. Vol. 2410. Springer. pp. 3–12.
|
|
483
|
+
071. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-71 "Jump up")**Wells, J. B. (1993). "Typability and type checking in the second-order lambda-calculus are equivalent and undecidable". _Tech. Rep. 93-011_: 176–185\\. [CiteSeerX](https://en.wikipedia.org/wiki/CiteSeerX_(identifier) "CiteSeerX (identifier)") [10.1.1.31.3590](https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.31.3590).
|
|
484
|
+
072. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-72 "Jump up")**Leroy, Xavier (17 September 2018). ["The Compcert verified compiler"](http://compcert.inria.fr/doc/index.html).
|
|
485
|
+
073. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-73 "Jump up")**Peyton Jones, Simon; Vytiniotis, Dimitrios; [Weirich, Stephanie](https://en.wikipedia.org/wiki/Stephanie_Weirich "Stephanie Weirich"); Geoffrey Washburn (April 2006). ["Simple unification-based type inference for GADTs"](http://research.microsoft.com/en-us/um/people/simonpj/papers/gadt/). _Icfp 2006_: 50–61.
|
|
486
|
+
074. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-74 "Jump up")**["OCaml Manual"](https://caml.inria.fr/pub/docs/manual-ocaml/gadts.html). _caml.inria.fr_. Retrieved 2021-03-08.
|
|
487
|
+
075. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-75 "Jump up")**["Algebraic Data Types"](https://docs.scala-lang.org/scala3/book/types-adts-gadts.html). _Scala Documentation_. Retrieved 2021-03-08.
|
|
488
|
+
076. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-76 "Jump up")**Kennedy, Andrew; Russo, Claudio V. (October 2005). [_Generalized Algebraic Data Types and Object-Oriented Programming_](https://web.archive.org/web/20061229164852/http://research.microsoft.com/~akenn/generics/gadtoop.pdf)(PDF). OOPSLA. San Diego, California: [ACM](https://en.wikipedia.org/wiki/Association_for_Computing_Machinery "Association for Computing Machinery"). [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1145/1094811.1094814](https://doi.org/10.1145%2F1094811.1094814). [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [9781595930316](https://en.wikipedia.org/wiki/Special:BookSources/9781595930316 "Special:BookSources/9781595930316"). Archived from [the original](https://www.microsoft.com/en-us/research/publication/generalized-algebraic-data-types-and-object-oriented-programming/) on 2006-12-29.
|
|
489
|
+
077. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-77 "Jump up")**Hughes, John. ["Why Functional Programming Matters"](http://www.cse.chalmers.se/~rjmh/Papers/whyfp.pdf)(PDF). [Chalmers University of Technology](https://en.wikipedia.org/wiki/Chalmers_University_of_Technology "Chalmers University of Technology").
|
|
490
|
+
078. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-78 "Jump up")**[_Purely functional data structures_](http://www.cambridge.org/us/academic/subjects/computer-science/algorithmics-complexity-computer-algebra-and-computational-g/purely-functional-data-structures) by [Chris Okasaki](https://en.wikipedia.org/wiki/Chris_Okasaki "Chris Okasaki"), [Cambridge University Press](https://en.wikipedia.org/wiki/Cambridge_University_Press "Cambridge University Press"), 1998, [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [0-521-66350-4](https://en.wikipedia.org/wiki/Special:BookSources/0-521-66350-4 "Special:BookSources/0-521-66350-4")
|
|
491
|
+
079. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-79 "Jump up")**L’orange, Jean Niklas. ["polymatheia - Understanding Clojure's Persistent Vector, pt. 1"](http://www.hypirion.com/musings/understanding-persistent-vector-pt-1). _Polymatheia_. Retrieved 2018-11-13.
|
|
492
|
+
080. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-80 "Jump up")**Michael Barr, Charles Well - Category theory for computer science.
|
|
493
|
+
081. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-81 "Jump up")**Newbern, J. ["All About Monads: A comprehensive guide to the theory and practice of monadic programming in Haskell"](http://monads.haskell.cz/html/index.html/html/). Retrieved 2008-02-14.
|
|
494
|
+
082. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-82 "Jump up")**["Thirteen ways of looking at a turtle"](https://fsharpforfunandprofit.com/posts/13-ways-of-looking-at-a-turtle/#2-basic-fp---a-module-of-functions-with-immutable-state). _fF# for fun and profit_. Retrieved 2018-11-13.
|
|
495
|
+
083. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-83 "Jump up")**Hartmanis, Juris; Hemachandra, Lane (1986). "Complexity classes without machines: On complete languages for UP". [_Automata, Languages and Programming_](https://doi.org/10.1007/3-540-16761-7_62). Lecture Notes in Computer Science. Vol. 226. Berlin, Heidelberg: Springer Berlin Heidelberg. pp. 123–135\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1007/3-540-16761-7\\_62](https://doi.org/10.1007%2F3-540-16761-7_62). [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-3-540-16761-7](https://en.wikipedia.org/wiki/Special:BookSources/978-3-540-16761-7 "Special:BookSources/978-3-540-16761-7"). Retrieved 2024-12-12.
|
|
496
|
+
084. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-84 "Jump up")**[Paulson, Larry C.](https://en.wikipedia.org/wiki/Lawrence_Paulson "Lawrence Paulson") (28 June 1996). [_ML for the Working Programmer_](https://books.google.com/books?id=XppZdaDs7e0C). Cambridge University Press. [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-0-521-56543-1](https://en.wikipedia.org/wiki/Special:BookSources/978-0-521-56543-1 "Special:BookSources/978-0-521-56543-1"). Retrieved 10 February 2013.
|
|
497
|
+
085. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Spiewak_85-0 "Jump up")**Spiewak, Daniel (26 August 2008). ["Implementing Persistent Vectors in Scala"](https://web.archive.org/web/20150923205254/http://www.codecommit.com/blog/scala/implementing-persistent-vectors-in-scala). _Code Commit_. Archived from [the original](http://www.codecommit.com/blog/scala/implementing-persistent-vectors-in-scala) on 23 September 2015. Retrieved 17 April 2012.
|
|
498
|
+
086. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-86 "Jump up")**["Which programs are fastest? \\| Computer Language Benchmarks Game"](https://web.archive.org/web/20130520162513/http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.php?gcc=on&ghc=on&clean=on&ocaml=on&sbcl=on&fsharp=on&racket=on&clojure=on&hipe=on&calc=chart). benchmarksgame.alioth.debian.org. Archived from [the original](http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.php?gcc=on&ghc=on&clean=on&ocaml=on&sbcl=on&fsharp=on&racket=on&clojure=on&hipe=on&calc=chart) on 2013-05-20. Retrieved 2011-06-20.
|
|
499
|
+
087. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-87 "Jump up")**Igor Pechtchanski; Vivek Sarkar (2005). "Immutability specification and its applications". _Concurrency and Computation: Practice and Experience_. **17** (5–6): 639–662\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1002/cpe.853](https://doi.org/10.1002%2Fcpe.853). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [34527406](https://api.semanticscholar.org/CorpusID:34527406).
|
|
500
|
+
088. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-88 "Jump up")**["An In-Depth Look at Clojure Collections"](https://www.infoq.com/articles/in-depth-look-clojure-collections/). _InfoQ_. Retrieved 2024-04-29.
|
|
501
|
+
089. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-89 "Jump up")**["References and Borrowing - The Rust Programming Language"](https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html). _doc.rust-lang.org_. Retrieved 2024-04-29.
|
|
502
|
+
090. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-90 "Jump up")**["Validating References with Lifetimes - The Rust Programming Language"](https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html). _doc.rust-lang.org_. Retrieved 2024-04-29.
|
|
503
|
+
091. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-91 "Jump up")**["Concurrent Collections (The Java™ Tutorials > Essential Java Classes > Concurrency)"](https://docs.oracle.com/javase/tutorial/essential/concurrency/collections.html). _docs.oracle.com_. Retrieved 2024-04-29.
|
|
504
|
+
092. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-92 "Jump up")**["Understanding The Actor Model To Build Non-blocking, High-throughput Distributed Systems - Scaleyourapp"](https://scaleyourapp.com/actor-model/). _scaleyourapp.com_. 2023-01-28. Retrieved 2024-04-29.
|
|
505
|
+
093. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-93 "Jump up")**Cesarini, Francesco; Thompson, Simon (2009). _Erlang programming: a concurrent approach to software development_ (1st ed.). O'Reilly Media, Inc. (published 2009-06-11). p. 6. [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-0-596-55585-6](https://en.wikipedia.org/wiki/Special:BookSources/978-0-596-55585-6 "Special:BookSources/978-0-596-55585-6").
|
|
506
|
+
094. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-94 "Jump up")**["Chapter 25. Profiling and optimization"](http://book.realworldhaskell.org/read/profiling-and-optimization.html#x_eK1). Book.realworldhaskell.org. Retrieved 2011-06-20.
|
|
507
|
+
095. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-95 "Jump up")**Berthe, Samuel (2024-04-29), [_samber/lo_](https://github.com/samber/lo), retrieved 2024-04-29
|
|
508
|
+
096. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-96 "Jump up")**["Go Wiki: Compiler And Runtime Optimizations - The Go Programming Language"](https://go.dev/wiki/CompilerOptimizations). _go.dev_. Retrieved 2024-04-29.
|
|
509
|
+
097. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-97 "Jump up")**["Comparing Performance: Loops vs. Iterators - The Rust Programming Language"](https://doc.rust-lang.org/book/ch13-04-performance.html). _doc.rust-lang.org_. Retrieved 2024-04-29.
|
|
510
|
+
098. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-98 "Jump up")**Hartel, Pieter; Henk Muller; Hugh Glaser (March 2004). ["The Functional C experience"](https://web.archive.org/web/20110719201553/http://www.ub.utwente.nl/webdocs/ctit/1/00000084.pdf)(PDF). _Journal of Functional Programming_. **14** (2): 129–135\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1017/S0956796803004817](https://doi.org/10.1017%2FS0956796803004817). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [32346900](https://api.semanticscholar.org/CorpusID:32346900). Archived from [the original](http://www.ub.utwente.nl/webdocs/ctit/1/00000084.pdf)(PDF) on 2011-07-19. Retrieved 2006-05-28.; David Mertz. ["Functional programming in Python, Part 3"](https://web.archive.org/web/20071016124848/http://www-128.ibm.com/developerworks/linux/library/l-prog3.html). _IBM developerWorks_. Archived from [the original](http://www-128.ibm.com/developerworks/linux/library/l-prog3.html) on 2007-10-16. Retrieved 2006-09-17.( [Part 1](https://web.archive.org/web/20071016124848/http://www-128.ibm.com/developerworks/linux/library/l-prog.html), [Part 2](https://web.archive.org/web/20071016124848/http://www-128.ibm.com/developerworks/linux/library/l-prog2.html))
|
|
511
|
+
099. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-99 "Jump up")**["Functions — D Programming Language 2.0"](http://www.digitalmars.com/d/2.0/function.html#pure-functions). Digital Mars. 30 December 2012.
|
|
512
|
+
100. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-100 "Jump up")**["Lua Unofficial FAQ (uFAQ)"](http://www.luafaq.org/#T1.2).
|
|
513
|
+
101. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-101 "Jump up")**["First-Class Functions in Go - The Go Programming Language"](https://golang.org/doc/codewalk/functions/). _golang.org_. Retrieved 2021-01-04.
|
|
514
|
+
102. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-102 "Jump up")**Eich, Brendan (3 April 2008). ["Popularity"](https://brendaneich.com/2008/04/popularity/).
|
|
515
|
+
103. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-103 "Jump up")**[van Rossum, Guido](https://en.wikipedia.org/wiki/Guido_van_Rossum "Guido van Rossum") (2009-04-21). ["Origins of Python's "Functional" Features"](http://python-history.blogspot.de/2009/04/origins-of-pythons-functional-features.html). Retrieved 2012-09-27.
|
|
516
|
+
104. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-104 "Jump up")**["functools — Higher order functions and operations on callable objects"](https://docs.python.org/dev/library/functools.html#functools.reduce). Python Software Foundation. 2011-07-31. Retrieved 2011-07-31.
|
|
517
|
+
105. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-105 "Jump up")**Skarsaune, Martin (2008). _The SICS Java Port Project Automatic Translation of a Large Object Oriented System from Smalltalk to Java_.
|
|
518
|
+
106. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-106 "Jump up")**Gosling, James. ["Closures"](https://web.archive.org/web/20130414180002/https://blogs.oracle.com/jag/entry/closures). _James Gosling: on the Java Road_. Oracle. Archived from [the original](http://blogs.oracle.com/jag/entry/closures) on 2013-04-14. Retrieved 11 May 2013.
|
|
519
|
+
107. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-107 "Jump up")**Williams, Michael (8 April 2013). ["Java SE 8 Lambda Quick Start"](https://blogs.oracle.com/javatraining/entry/java_se_8_lambda_quick).
|
|
520
|
+
108. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-108 "Jump up")**Bloch, Joshua (2008). "Item 15: Minimize Mutability". [_Effective Java_](https://archive.org/details/effectivejava00bloc_0) (Second ed.). Addison-Wesley. [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-0321356680](https://en.wikipedia.org/wiki/Special:BookSources/978-0321356680 "Special:BookSources/978-0321356680").
|
|
521
|
+
109. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-109 "Jump up")**["Object.freeze() - JavaScript \\| MDN"](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze). _developer.mozilla.org_. Retrieved 2021-01-04. The Object.freeze() method freezes an object. A frozen object can no longer be changed; freezing an object prevents new properties from being added to it, existing properties from being removed, prevents changing the enumerability, configurability, or writability of existing properties, and prevents the values of existing properties from being changed. In addition, freezing an object also prevents its prototype from being changed. freeze() returns the same object that was passed in.
|
|
522
|
+
110. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-110 "Jump up")**Daniel Friedman; William Byrd; Oleg Kiselyov; Jason Hemann (2018). _The Reasoned Schemer, Second Edition_. The MIT Press.
|
|
523
|
+
111. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-111 "Jump up")**A. Casas, D. Cabeza, M. V. Hermenegildo. A Syntactic Approach to
|
|
524
|
+
Combining Functional Notation, Lazy Evaluation and Higher-Order in
|
|
525
|
+
LP Systems. The 8th International Symposium on Functional and Logic
|
|
526
|
+
Programming (FLOPS'06), pages 142-162, April 2006.
|
|
527
|
+
112. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-112 "Jump up")**["How I do my Computing"](https://stallman.org/stallman-computing.html). _stallman.org_. Retrieved 2024-04-29.
|
|
528
|
+
113. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-113 "Jump up")**["Helix"](https://helix-editor.com/news/release-24-03-highlights/). _helix-editor.com_. Retrieved 2024-04-29.
|
|
529
|
+
114. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Wakeling2007_114-0 "Jump up")**Wakeling, David (2007). ["Spreadsheet functional programming"](http://www.activemode.org/webroot/Workers/ActiveTraining/Programming/Pro_SpreadsheetFunctionalProgramming.pdf)(PDF). _Journal of Functional Programming_. **17** (1): 131–143\\. [doi](https://en.wikipedia.org/wiki/Doi_(identifier) "Doi (identifier)"): [10.1017/S0956796806006186](https://doi.org/10.1017%2FS0956796806006186). [ISSN](https://en.wikipedia.org/wiki/ISSN_(identifier) "ISSN (identifier)") [0956-7968](https://search.worldcat.org/issn/0956-7968). [S2CID](https://en.wikipedia.org/wiki/S2CID_(identifier) "S2CID (identifier)") [29429059](https://api.semanticscholar.org/CorpusID:29429059).
|
|
530
|
+
115. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-excel_115-0 "Jump up")**[Peyton Jones, Simon](https://en.wikipedia.org/wiki/Simon_Peyton_Jones "Simon Peyton Jones"); [Burnett, Margaret](https://en.wikipedia.org/wiki/Margaret_Burnett "Margaret Burnett"); [Blackwell, Alan](https://en.wikipedia.org/wiki/Alan_Blackwell "Alan Blackwell") (March 2003). ["Improving the world's most popular functional language: user-defined functions in Excel"](https://web.archive.org/web/20051016011341/http://research.microsoft.com/~simonpj/Papers/excel/index.htm). Archived from [the original](http://research.microsoft.com/~simonpj/Papers/excel/index.htm) on 2005-10-16.
|
|
531
|
+
116. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-116 "Jump up")**Rodger, Richard (11 December 2017). _The Tao of Microservices_. Manning. [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [9781638351733](https://en.wikipedia.org/wiki/Special:BookSources/9781638351733 "Special:BookSources/9781638351733").
|
|
532
|
+
117. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-117 "Jump up")**Piro, Christopher (2009). [_Functional Programming at Facebook_](https://web.archive.org/web/20091017070140/http://cufp.galois.com/2009/abstracts.html#ChristopherPiroEugeneLetuchy). CUFP 2009. Archived from [the original](http://cufp.galois.com/2009/abstracts.html#ChristopherPiroEugeneLetuchy) on 2009-10-17. Retrieved 2009-08-29.
|
|
533
|
+
118. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-Sim-Diasca_118-0 "Jump up")**["Sim-Diasca: a large-scale discrete event concurrent simulation engine in Erlang"](https://web.archive.org/web/20130917092159/http://research.edf.com/research-and-the-scientific-community/software/sim-diasca-80704.html). November 2011. Archived from [the original](http://research.edf.com/research-and-the-scientific-community/software/sim-diasca-80704.html) on 2013-09-17. Retrieved 2011-11-08.
|
|
534
|
+
119. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-whatsapp.blog.2012_119-0 "Jump up")**[1 million is so 2011](https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/) [Archived](https://web.archive.org/web/20140219234031/http://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/) 2014-02-19 at the [Wayback Machine](https://en.wikipedia.org/wiki/Wayback_Machine "Wayback Machine") // WhatsApp blog, 2012-01-06: "the last important piece of our infrastracture is Erlang"
|
|
535
|
+
120. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-120 "Jump up")**Momtahan, Lee (2009). [_Scala at EDF Trading: Implementing a Domain-Specific Language for Derivative Pricing with Scala_](https://web.archive.org/web/20091017070140/http://cufp.galois.com/2009/abstracts.html#LeeMomtahan). CUFP 2009. Archived from [the original](http://cufp.galois.com/2009/abstracts.html#LeeMomtahan) on 2009-10-17. Retrieved 2009-08-29.
|
|
536
|
+
121. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-121 "Jump up")**Graham, Paul (2003). ["Beating the Averages"](http://www.paulgraham.com/avg.html). Retrieved 2009-08-29.
|
|
537
|
+
122. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-122 "Jump up")**Sims, Steve (2006). [_Building a Startup with Standard ML_](http://cufp.galois.com/2006/slides/SteveSims.pdf)(PDF). CUFP 2006. Retrieved 2009-08-29.
|
|
538
|
+
123. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-123 "Jump up")**Laurikari, Ville (2007). [_Functional Programming in Communications Security_](https://web.archive.org/web/20101221110947/http://cufp.galois.com/2007/abstracts.html#VilleLaurikari). CUFP 2007. Archived from [the original](http://cufp.galois.com/2007/abstracts.html#VilleLaurikari) on 2010-12-21. Retrieved 2009-08-29.
|
|
539
|
+
124. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-124 "Jump up")**Lorimer, R. J. (19 January 2009). ["Live Production Clojure Application Announced"](http://www.infoq.com/news/2009/01/clojure_production). _InfoQ_.
|
|
540
|
+
125. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-125 "Jump up")**Bugnion, Pascal (2016). _Scala for Data Science_ (1st ed.). [Packt](https://en.wikipedia.org/wiki/Packt "Packt"). [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [9781785281372](https://en.wikipedia.org/wiki/Special:BookSources/9781785281372 "Special:BookSources/9781785281372").
|
|
541
|
+
126. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-126 "Jump up")**["Why developers like ClojureScript"](https://stackshare.io/clojurescript). _StackShare_. Retrieved 2024-04-29.
|
|
542
|
+
127. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-127 "Jump up")**Herrick, Justin (2024-04-29), [_jah2488/elm-companies_](https://github.com/jah2488/elm-companies), retrieved 2024-04-29
|
|
543
|
+
128. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-128 "Jump up")**["Why developers like PureScript"](https://stackshare.io/purescript). _StackShare_. Retrieved 2024-04-29.
|
|
544
|
+
129. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-129 "Jump up")**Team, Editorial (2019-01-08). ["ALLEGRO - all you need to know about the best Polish online marketplace"](https://ecommercegermany.com/blog/allegro-all-you-need-to-know-about-the-best-polish-online-marketplace). _E-commerce Germany News_. Retrieved 2024-04-29.
|
|
545
|
+
130. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-130 "Jump up")**["Websites using Phoenix Framework - Wappalyzer"](https://www.wappalyzer.com/technologies/web-frameworks/phoenix-framework/). _www.wappalyzer.com_. Retrieved 2024-04-29.
|
|
546
|
+
131. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-oxfordFP_131-0 "Jump up")**["Functional Programming: 2019-2020"](https://www.cs.ox.ac.uk/teaching/courses/2019-2020/fp/). University of Oxford Department of Computer Science. Retrieved 28 April 2020.
|
|
547
|
+
132. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-imperialFP_132-0 "Jump up")**["Programming I (Haskell)"](https://www.imperial.ac.uk/computing/current-students/courses/120_1/). Imperial College London Department of Computing. Retrieved 28 April 2020.
|
|
548
|
+
133. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-nottinghamFP_133-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-nottinghamFP_133-1)["Computer Science BSc - Modules"](https://www.nottingham.ac.uk/ugstudy/course/Computer-Science-BSc#yearsmodules). Retrieved 28 April 2020.
|
|
549
|
+
134. ^ [Jump up to: _**a**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-mitFP_134-0) [_**b**_](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-mitFP_134-1)[Abelson, Hal](https://en.wikipedia.org/wiki/Hal_Abelson "Hal Abelson"); [Sussman, Gerald Jay](https://en.wikipedia.org/wiki/Gerald_Jay_Sussman "Gerald Jay Sussman") (1985). ["Preface to the Second Edition"](https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-6.html). [_Structure and Interpretation of Computer Programs_](http://mitpress.mit.edu/sicp/) (2 ed.). MIT Press. [Bibcode](https://en.wikipedia.org/wiki/Bibcode_(identifier) "Bibcode (identifier)"): [1985sicp.book.....A](https://ui.adsabs.harvard.edu/abs/1985sicp.book.....A).
|
|
550
|
+
135. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-61A_135-0 "Jump up")**John DeNero (Fall 2019). ["Computer Science 61A, Berkeley"](https://cs61a.org/articles/about.html). Department of Electrical Engineering and Computer Sciences, Berkeley. Retrieved 2020-08-14.
|
|
551
|
+
136. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-bootstrapworld_136-0 "Jump up")**[Emmanuel Schanzer of Bootstrap](https://twit.tv/shows/triangulation/episodes/196/) interviewed on the TV show _Triangulation_ on the [TWiT.tv](https://en.wikipedia.org/wiki/TWiT.tv "TWiT.tv") network
|
|
552
|
+
137. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-137 "Jump up")**["Why Scheme for Introductory Programming?"](https://home.adelphi.edu/sbloch/class/pbd/testimonials/). _home.adelphi.edu_. Retrieved 2024-04-29.
|
|
553
|
+
138. **[^](https://en.wikipedia.org/wiki/Functional_programming#cite_ref-138 "Jump up")**Staff, IMACS (2011-06-03). ["What Is Scheme & Why Is it Beneficial for Students?"](https://www.imacs.org/learn-computer-programming-using-scheme/). _IMACS – Making Better Thinkers for Life_. Retrieved 2024-04-29.
|
|
554
|
+
|
|
555
|
+
## Further reading
|
|
556
|
+
|
|
557
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=26 "Edit section: Further reading")\\]
|
|
558
|
+
|
|
559
|
+
- [Abelson, Hal](https://en.wikipedia.org/wiki/Hal_Abelson "Hal Abelson"); [Sussman, Gerald Jay](https://en.wikipedia.org/wiki/Gerald_Jay_Sussman "Gerald Jay Sussman") (1985). [_Structure and Interpretation of Computer Programs_](https://mitpress.mit.edu/9780262510363/structure-and-interpretation-of-computer-programs/). MIT Press. [Bibcode](https://en.wikipedia.org/wiki/Bibcode_(identifier) "Bibcode (identifier)"): [1985sicp.book.....A](https://ui.adsabs.harvard.edu/abs/1985sicp.book.....A).
|
|
560
|
+
- Cousineau, Guy and Michel Mauny. _The Functional Approach to Programming_. Cambridge, UK: [Cambridge University Press](https://en.wikipedia.org/wiki/Cambridge_University_Press "Cambridge University Press"), 1998.
|
|
561
|
+
- Curry, Haskell Brooks and Feys, Robert and Craig, William. _Combinatory Logic_. Volume I. North-Holland Publishing Company, Amsterdam, 1958.
|
|
562
|
+
- [Curry, Haskell B.](https://en.wikipedia.org/wiki/Haskell_Curry "Haskell Curry"); [Hindley, J. Roger](https://en.wikipedia.org/wiki/J._Roger_Hindley "J. Roger Hindley"); [Seldin, Jonathan P.](https://en.wikipedia.org/w/index.php?title=Jonathan_P._Seldin&action=edit&redlink=1 "Jonathan P. Seldin (page does not exist)") (1972). _Combinatory Logic_. Vol. II. Amsterdam: North Holland. [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-0-7204-2208-5](https://en.wikipedia.org/wiki/Special:BookSources/978-0-7204-2208-5 "Special:BookSources/978-0-7204-2208-5").
|
|
563
|
+
- Dominus, Mark Jason. _[Higher-Order Perl](http://hop.perl.plover.com/book/pdf/HigherOrderPerl.pdf)_. [Morgan Kaufmann](https://en.wikipedia.org/wiki/Morgan_Kaufmann "Morgan Kaufmann"). 2005.
|
|
564
|
+
- Felleisen, Matthias; Findler, Robert; Flatt, Matthew; Krishnamurthi, Shriram (2018). [_How to Design Programs_](http://www.htdp.org/). MIT Press.
|
|
565
|
+
- Graham, Paul. _ANSI Common LISP_. Englewood Cliffs, New Jersey: [Prentice Hall](https://en.wikipedia.org/wiki/Prentice_Hall "Prentice Hall"), 1996.
|
|
566
|
+
- MacLennan, Bruce J. _Functional Programming: Practice and Theory_. Addison-Wesley, 1990.
|
|
567
|
+
- Michaelson, Greg (10 April 2013). _An Introduction to Functional Programming Through Lambda Calculus_. Courier Corporation. [ISBN](https://en.wikipedia.org/wiki/ISBN_(identifier) "ISBN (identifier)") [978-0-486-28029-5](https://en.wikipedia.org/wiki/Special:BookSources/978-0-486-28029-5 "Special:BookSources/978-0-486-28029-5").
|
|
568
|
+
- O'Sullivan, Brian; Stewart, Don; Goerzen, John (2008). [_Real World Haskell_](http://book.realworldhaskell.org/read/). O'Reilly.
|
|
569
|
+
- Pratt, Terrence W. and [Marvin Victor Zelkowitz](https://en.wikipedia.org/wiki/Marvin_Victor_Zelkowitz "Marvin Victor Zelkowitz"). _Programming Languages: Design and Implementation_. 3rd ed. Englewood Cliffs, New Jersey: [Prentice Hall](https://en.wikipedia.org/wiki/Prentice_Hall "Prentice Hall"), 1996.
|
|
570
|
+
- Salus, Peter H. _Functional and Logic Programming Languages_. Vol. 4 of Handbook of Programming Languages. Indianapolis, Indiana: [Macmillan Technical Publishing](https://en.wikipedia.org/w/index.php?title=Macmillan_Technical_Publishing&action=edit&redlink=1 "Macmillan Technical Publishing (page does not exist)"), 1998.
|
|
571
|
+
- Thompson, Simon. _Haskell: The Craft of Functional Programming_. Harlow, England: [Addison-Wesley Longman Limited](https://en.wikipedia.org/w/index.php?title=Addison-Wesley_Longman_Limited&action=edit&redlink=1 "Addison-Wesley Longman Limited (page does not exist)"), 1996.
|
|
572
|
+
|
|
573
|
+
## External links
|
|
574
|
+
|
|
575
|
+
\\[ [edit](https://en.wikipedia.org/w/index.php?title=Functional_programming&action=edit§ion=27 "Edit section: External links")\\]
|
|
576
|
+
|
|
577
|
+
Listen to this article (28 minutes)
|
|
578
|
+
|
|
579
|
+
[Play audio](https://en.wikipedia.org/wiki/File:En-Functional_programming.ogg "Play audio") Duration: 27 minutes and 59 seconds.27:59
|
|
580
|
+
|
|
581
|
+

|
|
582
|
+
|
|
583
|
+
[This audio file](https://en.wikipedia.org/wiki/File:En-Functional_programming.ogg "File:En-Functional programming.ogg") was created from a revision of this article dated 25 August 2011 (2011-08-25), and does not reflect subsequent edits.
|
|
584
|
+
|
|
585
|
+
( [Audio help](https://en.wikipedia.org/wiki/Wikipedia:Media_help "Wikipedia:Media help") · [More spoken articles](https://en.wikipedia.org/wiki/Wikipedia:Spoken_articles "Wikipedia:Spoken articles"))
|
|
586
|
+
|
|
587
|
+
- Ford, Neal. ["Functional thinking"](http://nealford.com/functionalthinking.html). Retrieved 2021-11-10.
|
|
588
|
+
- Akhmechet, Slava (2006-06-19). ["defmacro – Functional Programming For The Rest of Us"](http://www.defmacro.org/ramblings/fp.html). Retrieved 2013-02-24. An introduction
|
|
589
|
+
- _Functional programming in Python_ (by David Mertz): [part 1](http://gnosis.cx/publish/programming/charming_python_13.html), [part 2](http://gnosis.cx/publish/programming/charming_python_16.html), [part 3](http://gnosis.cx/publish/programming/charming_python_19.html)
|
|
590
|
+
|
|
591
|
+
| show<br>[Programming paradigms](https://en.wikipedia.org/wiki/Programming_paradigm "Programming paradigm") ( [Comparison by language](https://en.wikipedia.org/wiki/Comparison_of_multi-paradigm_programming_languages "Comparison of multi-paradigm programming languages")) |
|
|
592
|
+
| --- |
|
|
593
|
+
| [Imperative](https://en.wikipedia.org/wiki/Imperative_programming "Imperative programming") | | [Structured](https://en.wikipedia.org/wiki/Structured_programming "Structured programming") | - [Jackson structures](https://en.wikipedia.org/wiki/Jackson_structured_programming "Jackson structured programming")<br>- [Block-structured](https://en.wikipedia.org/wiki/Block_(programming) "Block (programming)")<br>- [Modular](https://en.wikipedia.org/wiki/Modular_programming "Modular programming")<br>- [Non-structured](https://en.wikipedia.org/wiki/Non-structured_programming "Non-structured programming")<br>- [Procedural](https://en.wikipedia.org/wiki/Procedural_programming "Procedural programming")<br>- [Programming in the large and in the small](https://en.wikipedia.org/wiki/Programming_in_the_large_and_programming_in_the_small "Programming in the large and programming in the small")<br>- [Design by contract](https://en.wikipedia.org/wiki/Design_by_contract "Design by contract")<br>- [Invariant-based](https://en.wikipedia.org/wiki/Invariant-based_programming "Invariant-based programming")<br>- [Nested function](https://en.wikipedia.org/wiki/Nested_function "Nested function") |
|
|
594
|
+
| [Object-oriented](https://en.wikipedia.org/wiki/Object-oriented_programming "Object-oriented programming")<br>( [comparison](https://en.wikipedia.org/wiki/Comparison_of_programming_languages_(object-oriented_programming) "Comparison of programming languages (object-oriented programming)"), [list](https://en.wikipedia.org/wiki/List_of_object-oriented_programming_languages "List of object-oriented programming languages")) | - [Class-based](https://en.wikipedia.org/wiki/Class-based_programming "Class-based programming"), [Prototype-based](https://en.wikipedia.org/wiki/Prototype-based_programming "Prototype-based programming"), [Object-based](https://en.wikipedia.org/wiki/Object-based_language "Object-based language")<br>- [Agent](https://en.wikipedia.org/wiki/Agent-oriented_programming "Agent-oriented programming")<br>- [Immutable object](https://en.wikipedia.org/wiki/Immutable_object "Immutable object")<br>- [Persistent](https://en.wikipedia.org/wiki/Persistent_programming_language "Persistent programming language")<br>- [Uniform function call syntax](https://en.wikipedia.org/wiki/Uniform_function_call_syntax "Uniform function call syntax") | |
|
|
595
|
+
| [Declarative](https://en.wikipedia.org/wiki/Declarative_programming "Declarative programming") | | Functional<br>( [comparison](https://en.wikipedia.org/wiki/Comparison_of_functional_programming_languages "Comparison of functional programming languages")) | - [Recursive](https://en.wikipedia.org/wiki/Recursion_(computer_science) "Recursion (computer science)")<br>- [Anonymous function](https://en.wikipedia.org/wiki/Anonymous_function "Anonymous function") ( [Partial application](https://en.wikipedia.org/wiki/Partial_application "Partial application"))<br>- [Higher-order](https://en.wikipedia.org/wiki/Higher-order_programming "Higher-order programming")<br>- [Purely functional](https://en.wikipedia.org/wiki/Purely_functional_programming "Purely functional programming")<br>- [Total](https://en.wikipedia.org/wiki/Total_functional_programming "Total functional programming")<br>- [Strict](https://en.wikipedia.org/wiki/Strict_programming_language "Strict programming language")<br>- [GADTs](https://en.wikipedia.org/wiki/Generalized_algebraic_data_type "Generalized algebraic data type")<br>- [Dependent types](https://en.wikipedia.org/wiki/Dependent_type "Dependent type")<br>- [Functional logic](https://en.wikipedia.org/wiki/Functional_logic_programming "Functional logic programming")<br>- [Point-free style](https://en.wikipedia.org/wiki/Tacit_programming "Tacit programming")<br>- [Expression-oriented](https://en.wikipedia.org/wiki/Expression-oriented_programming_language "Expression-oriented programming language")<br>- [Applicative](https://en.wikipedia.org/wiki/Applicative_programming_language "Applicative programming language"), [Concatenative](https://en.wikipedia.org/wiki/Concatenative_programming_language "Concatenative programming language")<br>- [Function-level](https://en.wikipedia.org/wiki/Function-level_programming "Function-level programming"), [Value-level](https://en.wikipedia.org/wiki/Value-level_programming "Value-level programming") |
|
|
596
|
+
| [Dataflow](https://en.wikipedia.org/wiki/Dataflow_programming "Dataflow programming") | - [Flow-based](https://en.wikipedia.org/wiki/Flow-based_programming "Flow-based programming")<br>- [Reactive](https://en.wikipedia.org/wiki/Reactive_programming "Reactive programming") ( [Functional reactive](https://en.wikipedia.org/wiki/Functional_reactive_programming "Functional reactive programming"))<br>- [Signals](https://en.wikipedia.org/wiki/Signal_programming "Signal programming")<br>- [Streams](https://en.wikipedia.org/wiki/Stream_processing "Stream processing")<br>- [Synchronous](https://en.wikipedia.org/wiki/Synchronous_programming_language "Synchronous programming language") |
|
|
597
|
+
| [Logic](https://en.wikipedia.org/wiki/Logic_programming "Logic programming") | - [Abductive logic](https://en.wikipedia.org/wiki/Abductive_logic_programming "Abductive logic programming")<br>- [Answer set](https://en.wikipedia.org/wiki/Answer_set_programming "Answer set programming")<br>- [Constraint](https://en.wikipedia.org/wiki/Constraint_programming "Constraint programming") ( [Constraint logic](https://en.wikipedia.org/wiki/Constraint_logic_programming "Constraint logic programming"))<br>- [Inductive logic](https://en.wikipedia.org/wiki/Inductive_logic_programming "Inductive logic programming")<br>- [Nondeterministic](https://en.wikipedia.org/wiki/Nondeterministic_programming "Nondeterministic programming")<br>- [Ontology](https://en.wikipedia.org/wiki/Ontology_language "Ontology language")<br>- [Probabilistic logic](https://en.wikipedia.org/wiki/Probabilistic_logic_programming "Probabilistic logic programming")<br>- [Query](https://en.wikipedia.org/wiki/Query_language "Query language") |
|
|
598
|
+
| [DSL](https://en.wikipedia.org/wiki/Domain-specific_language "Domain-specific language") | - [Algebraic modeling](https://en.wikipedia.org/wiki/Algebraic_modeling_language "Algebraic modeling language")<br>- [Array](https://en.wikipedia.org/wiki/Array_programming "Array programming")<br>- [Automata-based](https://en.wikipedia.org/wiki/Automata-based_programming "Automata-based programming") ( [Action](https://en.wikipedia.org/wiki/Action_language "Action language"))<br>- [Command](https://en.wikipedia.org/wiki/Command_language "Command language") ( [Spacecraft](https://en.wikipedia.org/wiki/Spacecraft_command_language "Spacecraft command language"))<br>- [Differentiable](https://en.wikipedia.org/wiki/Differentiable_programming "Differentiable programming")<br>- [End-user](https://en.wikipedia.org/wiki/End-user_development "End-user development")<br>- [Grammar-oriented](https://en.wikipedia.org/wiki/Grammar-oriented_programming "Grammar-oriented programming")<br>- [Interface description](https://en.wikipedia.org/wiki/Interface_description_language "Interface description language")<br>- [Language-oriented](https://en.wikipedia.org/wiki/Language-oriented_programming "Language-oriented programming")<br>- [List comprehension](https://en.wikipedia.org/wiki/List_comprehension "List comprehension")<br>- [Low-code](https://en.wikipedia.org/wiki/Low-code_development_platform "Low-code development platform")<br>- [Modeling](https://en.wikipedia.org/wiki/Modeling_language "Modeling language")<br>- [Natural language](https://en.wikipedia.org/wiki/Natural-language_programming "Natural-language programming")<br>- [Non-English-based](https://en.wikipedia.org/wiki/Non-English-based_programming_languages "Non-English-based programming languages")<br>- [Page description](https://en.wikipedia.org/wiki/Page_description_language "Page description language")<br>- [Pipes](https://en.wikipedia.org/wiki/Pipeline_(software) "Pipeline (software)") and [filters](https://en.wikipedia.org/wiki/Filter_(software) "Filter (software)")<br>- [Probabilistic](https://en.wikipedia.org/wiki/Probabilistic_programming "Probabilistic programming")<br>- [Quantum](https://en.wikipedia.org/wiki/Quantum_programming "Quantum programming")<br>- [Scientific](https://en.wikipedia.org/wiki/Scientific_programming_language "Scientific programming language")<br>- [Scripting](https://en.wikipedia.org/wiki/Scripting_language "Scripting language")<br>- [Set-theoretic](https://en.wikipedia.org/wiki/Set_theoretic_programming "Set theoretic programming")<br>- [Simulation](https://en.wikipedia.org/wiki/Simulation_language "Simulation language")<br>- [Stack-based](https://en.wikipedia.org/wiki/Stack-oriented_programming "Stack-oriented programming")<br>- [System](https://en.wikipedia.org/wiki/System_programming_language "System programming language")<br>- [Tactile](https://en.wikipedia.org/wiki/Tactile_programming_language "Tactile programming language")<br>- [Templating](https://en.wikipedia.org/wiki/Template_processor "Template processor")<br>- [Transformation](https://en.wikipedia.org/wiki/Transformation_language "Transformation language") ( [Graph rewriting](https://en.wikipedia.org/wiki/Graph_rewriting "Graph rewriting"), [Production](https://en.wikipedia.org/wiki/Production_system_(computer_science) "Production system (computer science)"), [Pattern](https://en.wikipedia.org/wiki/Pattern_matching "Pattern matching"))<br>- [Visual](https://en.wikipedia.org/wiki/Visual_programming_language "Visual programming language") | |
|
|
599
|
+
| [Concurrent](https://en.wikipedia.org/wiki/Concurrent_computing "Concurrent computing"),<br>[distributed](https://en.wikipedia.org/wiki/Distributed_computing "Distributed computing"),<br>[parallel](https://en.wikipedia.org/wiki/Parallel_computing "Parallel computing") | - [Actor-based](https://en.wikipedia.org/wiki/Actor_model "Actor model")<br>- [Automatic mutual exclusion](https://en.wikipedia.org/wiki/Automatic_mutual_exclusion "Automatic mutual exclusion")<br>- [Choreographic programming](https://en.wikipedia.org/wiki/Choreographic_programming "Choreographic programming")<br>- [Concurrent logic](https://en.wikipedia.org/wiki/Concurrent_logic_programming "Concurrent logic programming") ( [Concurrent constraint logic](https://en.wikipedia.org/wiki/Concurrent_constraint_logic_programming "Concurrent constraint logic programming"))<br>- [Concurrent OO](https://en.wikipedia.org/wiki/Concurrent_object-oriented_programming "Concurrent object-oriented programming")<br>- [Macroprogramming](https://en.wikipedia.org/wiki/Macroprogramming "Macroprogramming")<br>- [Multitier programming](https://en.wikipedia.org/wiki/Multitier_programming "Multitier programming")<br>- [Organic computing](https://en.wikipedia.org/wiki/Organic_computing "Organic computing")<br>- [Parallel programming models](https://en.wikipedia.org/wiki/Parallel_programming_model "Parallel programming model")<br>- [Partitioned global address space](https://en.wikipedia.org/wiki/Partitioned_global_address_space "Partitioned global address space")<br>- [Process-oriented](https://en.wikipedia.org/wiki/Process-oriented_programming "Process-oriented programming")<br>- [Relativistic programming](https://en.wikipedia.org/wiki/Relativistic_programming "Relativistic programming")<br>- [Service-oriented](https://en.wikipedia.org/wiki/Service-oriented_programming "Service-oriented programming")<br>- [Structured concurrency](https://en.wikipedia.org/wiki/Structured_concurrency "Structured concurrency") |
|
|
600
|
+
| [Metaprogramming](https://en.wikipedia.org/wiki/Metaprogramming "Metaprogramming") | - [Attribute-oriented](https://en.wikipedia.org/wiki/Attribute-oriented_programming "Attribute-oriented programming")<br>- [Automatic](https://en.wikipedia.org/wiki/Automatic_programming "Automatic programming") ( [Inductive](https://en.wikipedia.org/wiki/Inductive_programming "Inductive programming"))<br>- [Dynamic](https://en.wikipedia.org/wiki/Dynamic_programming_language "Dynamic programming language")<br>- [Extensible](https://en.wikipedia.org/wiki/Extensible_programming "Extensible programming")<br>- [Generic](https://en.wikipedia.org/wiki/Generic_programming "Generic programming")<br>- [Homoiconicity](https://en.wikipedia.org/wiki/Homoiconicity "Homoiconicity")<br>- [Interactive](https://en.wikipedia.org/wiki/Interactive_programming "Interactive programming")<br>- [Macro](https://en.wikipedia.org/wiki/Macro_(computer_science) "Macro (computer science)") ( [Hygienic](https://en.wikipedia.org/wiki/Hygienic_macro "Hygienic macro"))<br>- [Metalinguistic abstraction](https://en.wikipedia.org/wiki/Metalinguistic_abstraction "Metalinguistic abstraction")<br>- [Multi-stage](https://en.wikipedia.org/wiki/Multi-stage_programming "Multi-stage programming")<br>- [Program synthesis](https://en.wikipedia.org/wiki/Program_synthesis "Program synthesis") ( [Bayesian](https://en.wikipedia.org/wiki/Bayesian_program_synthesis "Bayesian program synthesis"), [Inferential](https://en.wikipedia.org/wiki/Inferential_programming "Inferential programming"), [by demonstration](https://en.wikipedia.org/wiki/Programming_by_demonstration "Programming by demonstration"), [by example](https://en.wikipedia.org/wiki/Programming_by_example "Programming by example"))<br>- [Reflective](https://en.wikipedia.org/wiki/Reflective_programming "Reflective programming")<br>- [Self-modifying code](https://en.wikipedia.org/wiki/Self-modifying_code "Self-modifying code")<br>- [Symbolic](https://en.wikipedia.org/wiki/Symbolic_programming "Symbolic programming")<br>- [Template](https://en.wikipedia.org/wiki/Template_metaprogramming "Template metaprogramming") |
|
|
601
|
+
| [Separation\\<br>\\<br>of concerns](https://en.wikipedia.org/wiki/Separation_of_concerns "Separation of concerns") | - [Aspects](https://en.wikipedia.org/wiki/Aspect-oriented_programming "Aspect-oriented programming")<br>- [Components](https://en.wikipedia.org/wiki/Component-based_software_engineering "Component-based software engineering")<br>- [Data-driven](https://en.wikipedia.org/wiki/Data-driven_programming "Data-driven programming")<br>- [Data-oriented](https://en.wikipedia.org/wiki/Data-oriented_design "Data-oriented design")<br>- [Event-driven](https://en.wikipedia.org/wiki/Event-driven_programming "Event-driven programming")<br>- [Features](https://en.wikipedia.org/wiki/Feature-oriented_programming "Feature-oriented programming")<br>- [Literate](https://en.wikipedia.org/wiki/Literate_programming "Literate programming")<br>- [Roles](https://en.wikipedia.org/wiki/Role-oriented_programming "Role-oriented programming")<br>- [Subjects](https://en.wikipedia.org/wiki/Subject-oriented_programming "Subject-oriented programming") |
|
|
602
|
+
|
|
603
|
+
| show<br>[Types of programming languages](https://en.wikipedia.org/wiki/Programming_paradigm "Programming paradigm") |
|
|
604
|
+
| --- |
|
|
605
|
+
| Level | - [Machine](https://en.wikipedia.org/wiki/Machine_code "Machine code")<br>- [Assembly](https://en.wikipedia.org/wiki/Assembly_language "Assembly language")<br>- [Compiled](https://en.wikipedia.org/wiki/Compiled_language "Compiled language")<br>- [Interpreted](https://en.wikipedia.org/wiki/Interpreted_language "Interpreted language")<br>- [Low-level](https://en.wikipedia.org/wiki/Low-level_programming_language "Low-level programming language")<br>- [High-level](https://en.wikipedia.org/wiki/High-level_programming_language "High-level programming language")<br>- [Very high-level](https://en.wikipedia.org/wiki/Very_high-level_programming_language "Very high-level programming language")<br>- [Esoteric](https://en.wikipedia.org/wiki/Esoteric_programming_language "Esoteric programming language") |
|
|
606
|
+
| [Generation](https://en.wikipedia.org/wiki/Programming_language_generations "Programming language generations") | - [First](https://en.wikipedia.org/wiki/First-generation_programming_language "First-generation programming language")<br>- [Second](https://en.wikipedia.org/wiki/Second-generation_programming_language "Second-generation programming language")<br>- [Third](https://en.wikipedia.org/wiki/Third-generation_programming_language "Third-generation programming language")<br>- [Fourth](https://en.wikipedia.org/wiki/Fourth-generation_programming_language "Fourth-generation programming language")<br>- [Fifth](https://en.wikipedia.org/wiki/Fifth-generation_programming_language "Fifth-generation programming language") |
|
|
607
|
+
|
|
608
|
+
| [Authority control databases](https://en.wikipedia.org/wiki/Help:Authority_control "Help:Authority control"): National [](https://www.wikidata.org/wiki/Q193076#identifiers "Edit this at Wikidata") | - [Germany](https://d-nb.info/gnd/4198740-8)<br>- [United States](https://id.loc.gov/authorities/sh87007844)<br>- [France](https://catalogue.bnf.fr/ark:/12148/cb121910539)<br>- [BnF data](https://data.bnf.fr/ark:/12148/cb121910539)<br>- [Czech Republic](https://aleph.nkp.cz/F/?func=find-c&local_base=aut&ccl_term=ica=ph572639&CON_LNG=ENG)<br>- [Spain](https://datos.bne.es/resource/XX547935)<br>- [Israel](https://www.nli.org.il/en/authorities/987007541542105171) |
|
|
609
|
+
|
|
610
|
+
Retrieved from " [https://en.wikipedia.org/w/index.php?title=Functional\\_programming&oldid=1288545228](https://en.wikipedia.org/w/index.php?title=Functional_programming&oldid=1288545228)"
|
|
611
|
+
|
|
612
|
+
[Categories](https://en.wikipedia.org/wiki/Help:Category "Help:Category"):
|
|
613
|
+
|
|
614
|
+
- [Functional programming](https://en.wikipedia.org/wiki/Category:Functional_programming "Category:Functional programming")
|
|
615
|
+
- [Programming paradigms](https://en.wikipedia.org/wiki/Category:Programming_paradigms "Category:Programming paradigms")
|
|
616
|
+
- [Programming language comparisons](https://en.wikipedia.org/wiki/Category:Programming_language_comparisons "Category:Programming language comparisons")
|
|
617
|
+
|
|
618
|
+
Hidden categories:
|
|
619
|
+
|
|
620
|
+
- [CS1 maint: DOI inactive as of November 2024](https://en.wikipedia.org/wiki/Category:CS1_maint:_DOI_inactive_as_of_November_2024 "Category:CS1 maint: DOI inactive as of November 2024")
|
|
621
|
+
- [CS1 French-language sources (fr)](https://en.wikipedia.org/wiki/Category:CS1_French-language_sources_(fr) "Category:CS1 French-language sources (fr)")
|
|
622
|
+
- [Webarchive template wayback links](https://en.wikipedia.org/wiki/Category:Webarchive_template_wayback_links "Category:Webarchive template wayback links")
|
|
623
|
+
- [Articles with short description](https://en.wikipedia.org/wiki/Category:Articles_with_short_description "Category:Articles with short description")
|
|
624
|
+
- [Short description matches Wikidata](https://en.wikipedia.org/wiki/Category:Short_description_matches_Wikidata "Category:Short description matches Wikidata")
|
|
625
|
+
- [All articles with unsourced statements](https://en.wikipedia.org/wiki/Category:All_articles_with_unsourced_statements "Category:All articles with unsourced statements")
|
|
626
|
+
- [Articles with unsourced statements from February 2017](https://en.wikipedia.org/wiki/Category:Articles_with_unsourced_statements_from_February_2017 "Category:Articles with unsourced statements from February 2017")
|
|
627
|
+
- [Articles with unsourced statements from July 2018](https://en.wikipedia.org/wiki/Category:Articles_with_unsourced_statements_from_July_2018 "Category:Articles with unsourced statements from July 2018")
|
|
628
|
+
- [Articles with unsourced statements from June 2014](https://en.wikipedia.org/wiki/Category:Articles_with_unsourced_statements_from_June_2014 "Category:Articles with unsourced statements from June 2014")
|
|
629
|
+
- [Articles with unsourced statements from April 2015](https://en.wikipedia.org/wiki/Category:Articles_with_unsourced_statements_from_April_2015 "Category:Articles with unsourced statements from April 2015")
|
|
630
|
+
- [Articles with unsourced statements from August 2022](https://en.wikipedia.org/wiki/Category:Articles_with_unsourced_statements_from_August_2022 "Category:Articles with unsourced statements from August 2022")
|
|
631
|
+
- [Articles with hAudio microformats](https://en.wikipedia.org/wiki/Category:Articles_with_hAudio_microformats "Category:Articles with hAudio microformats")
|
|
632
|
+
- [Spoken articles](https://en.wikipedia.org/wiki/Category:Spoken_articles "Category:Spoken articles")
|
|
633
|
+
- [Articles with example C code](https://en.wikipedia.org/wiki/Category:Articles_with_example_C_code "Category:Articles with example C code")
|
|
634
|
+
- [Articles with example JavaScript code](https://en.wikipedia.org/wiki/Category:Articles_with_example_JavaScript_code "Category:Articles with example JavaScript code")
|
|
635
|
+
- [Articles with example Lisp (programming language) code](https://en.wikipedia.org/wiki/Category:Articles_with_example_Lisp_(programming_language)_code "Category:Articles with example Lisp (programming language) code")
|
|
636
|
+
|
|
637
|
+
Search
|
|
638
|
+
|
|
639
|
+
Search
|
|
640
|
+
|
|
641
|
+
Functional programming
|
|
642
|
+
|
|
643
|
+
54 languages[Add topic](https://en.wikipedia.org/wiki/Functional_programming#)
|