Computer science is the study of the theoretical foundations of information and computation, and of practical techniques for their implementation and application in computer systems.... , functional programming is a programming paradigm
Programming paradigm
A programming paradigm is a fundamental style of computer programming. . Paradigms differ in the concepts and abstractions used to represent the elements of a program and the steps that compose a computation .... that treats computation
Computation
Computation is a general term for any type of information processing. This includes phenomena ranging from human thinking to calculations with a more narrow meaning.... as the evaluation of mathematical function
Function (mathematics)
The mathematical concept of a function expresses dependence between two quantities, one of which is known and the other which is produced. A function associates a single output to each input element drawn from a fixed Set , such as the real numbers , although different inputs may have the same output.... s and avoids state
Program state
One of the key concepts in computer programming is the idea of state, essentially a snapshot of the measure of various conditions in the system.... and mutable
Immutable object
In object-oriented computer programming and Functional_programming programming, an immutable object is an object whose state cannot be modified after it is created.... data. It emphasizes the application of functions, in contrast to the imperative programming
Imperative programming
In computer science, imperative programming is a programming paradigm that describes computation in terms of statement s that change a program state .... style, which emphasizes changes in state. Functional programming has its roots in the lambda calculus
Lambda calculus
In mathematical logic and computer science, lambda calculus, also written as ?-calculus, is a formal system designed to investigate function definition, function application and recursion.... , a formal system
Formal system
In logic, a formal system consists of a formal language together with a deductive system which consists of a set of inference rules and/or axioms.... developed in the 1930s to investigate function definition, function application, and recursion
Recursion
Recursion, in mathematics and computer science, is a method of defining Function in which the function being defined is applied within its own definition.... . Many functional programming
Computer programming
Computer programming is the process of writing, testing, debugging/troubleshooting, and maintaining the source code of computer programs. This source code is written in a programming language.... languages
Programming language
A programming language is a machine-readable artificial language designed to express computations that can be performed by a machine, particularly a computer.... can be viewed as embellishments to the lambda calculus.
In practice, the difference between a mathematical function and the notion of a "function" used in imperative programming is that imperative functions can have side effects
Side effect (computer science)
In computer science, a subroutine or expression is said to produce a side effect if it modifies some state_ in addition to returning a value. For example, a function might modify a global or a static variable, modify one of its arguments, write data to a display or file, or read some data from other side-effecting functions.... , changing the value of already calculated computations.
Discussion
Ask a question about 'Functional programming'
Start a new discussion about 'Functional programming'
Computer science is the study of the theoretical foundations of information and computation, and of practical techniques for their implementation and application in computer systems.... , functional programming is a programming paradigm
Programming paradigm
A programming paradigm is a fundamental style of computer programming. . Paradigms differ in the concepts and abstractions used to represent the elements of a program and the steps that compose a computation .... that treats computation
Computation
Computation is a general term for any type of information processing. This includes phenomena ranging from human thinking to calculations with a more narrow meaning.... as the evaluation of mathematical function
Function (mathematics)
The mathematical concept of a function expresses dependence between two quantities, one of which is known and the other which is produced. A function associates a single output to each input element drawn from a fixed Set , such as the real numbers , although different inputs may have the same output.... s and avoids state
Program state
One of the key concepts in computer programming is the idea of state, essentially a snapshot of the measure of various conditions in the system.... and mutable
Immutable object
In object-oriented computer programming and Functional_programming programming, an immutable object is an object whose state cannot be modified after it is created.... data. It emphasizes the application of functions, in contrast to the imperative programming
Imperative programming
In computer science, imperative programming is a programming paradigm that describes computation in terms of statement s that change a program state .... style, which emphasizes changes in state. Functional programming has its roots in the lambda calculus
Lambda calculus
In mathematical logic and computer science, lambda calculus, also written as ?-calculus, is a formal system designed to investigate function definition, function application and recursion.... , a formal system
Formal system
In logic, a formal system consists of a formal language together with a deductive system which consists of a set of inference rules and/or axioms.... developed in the 1930s to investigate function definition, function application, and recursion
Recursion
Recursion, in mathematics and computer science, is a method of defining Function in which the function being defined is applied within its own definition.... . Many functional programming
Computer programming
Computer programming is the process of writing, testing, debugging/troubleshooting, and maintaining the source code of computer programs. This source code is written in a programming language.... languages
Programming language
A programming language is a machine-readable artificial language designed to express computations that can be performed by a machine, particularly a computer.... can be viewed as embellishments to the lambda calculus.
In practice, the difference between a mathematical function and the notion of a "function" used in imperative programming is that imperative functions can have side effects
Side effect (computer science)
In computer science, a subroutine or expression is said to produce a side effect if it modifies some state_ in addition to returning a value. For example, a function might modify a global or a static variable, modify one of its arguments, write data to a display or file, or read some data from other side-effecting functions.... , changing the value of already calculated computations. Because of this they lack referential transparency, i.e. the same language expression can result in different values at different times depending on the state of the executing program. Conversely, in functional code, the output value of a function depends only on the arguments that are input to the function, so calling a function f twice with the same value for an argument x will produce the same result f(x) both times. Eliminating side-effects can make it much easier to understand and predict the behavior of a program, which is one of the key motivations for the development of functional programming.
Purely functional is a term in computing used to describe algorithms, data structures or programming languages that exclude destructive modifications .... ones, have largely been emphasized in academia rather than in commercial software development. However, notable functional programming languages used in industry and commercial applications include
Erlang, OCaml
Objective Caml
Objective Caml, or OCaml is the main implementation of the Caml programming language, created by Xavier Leroy, J?r?me Vouillon, Damien Doligez, Didier R?my and others in 1996.... ,
Haskell
Haskell (programming language)
Haskell is a standardized, purely functional programming language with non-strict programming language, named after logician Haskell Curry. The goals of the language are described as:... ,
Scheme
and domain-specific programming language
Domain-specific programming language
In software development, a domain-specific language is a programming language or specification language dedicated to a particular problem domain, a particular problem representation technique, and/or a particular solution technique.... s like
R
R (programming language)
In computing, R is a programming language and software environment for statistics computing and graphics. It is an implementation of the S programming language with lexical scoping semantics inspired by Scheme .... (statistics), Mathematica
Mathematica
Mathematica is a computational software program used widely in scientific, engineering, and mathematical fields and other areas of technical computing.... (symbolic math),
J
J (programming language)
The J programming language, developed in the early 1990s by Kenneth Iverson and Roger Hui, is a synthesis of APL programming language and the FP programming language and FL programming language function-level languages created by John Backus.... and K
K (programming language)
K is a proprietary array processing language developed by Arthur Whitney and commercialized by Kx Systems. The language serves as the foundation for KDB, an in-memory, column-based database, and other related financial products.... (financial analysis), and XSLT (XML). Widespread declarative domain specific languages like SQL
SQL
SQL is a database computer language designed for the retrieval and management of data in relational database management systems , database schema creation and modification, and database object access control management.... and Lex
Lex programming tool
In computer science, lex is a Computer program that generates lexical analysiss . Lex is commonly used with the yacc parser generator. Lex, originally written by Eric Schmidt and Mike Lesk, is the standard lexical analyzer generator on many Unix systems, and a tool exhibiting its behavior is specified as part of the POSIX standard.... /Yacc
Yacc
The computer program yacc is a parser generator developed by Stephen C. Johnson at AT&T for the Unix operating system. The name is an acronym for "Yet Another Compiler Compiler." It generates a parsing based on an Formal grammar written in a notation similar to Backus-Naur form.... , use some elements of functional programming, especially in eschewing mutable values. Spreadsheet
Spreadsheet
A spreadsheet is a computer application that simulates a paper worksheet. It displays multiple cells that together make up a grid consisting of rows and columns, each cell containing either alphanumeric text or numeric values.... s can also be viewed as functional programming languages.
Programming in a functional style can be accomplished in languages, such as C, C++, Python, or Java, that aren't specifically designed for functional programming.
In mathematical logic and computer science, lambda calculus, also written as ?-calculus, is a formal system designed to investigate function definition, function application and recursion.... provides a theoretical framework for describing functions and their evaluation. Although it is a mathematical abstraction rather than a programming language, it forms the basis of almost all functional programming languages today. An equivalent theoretical formulation, combinatory logic
Combinatory logic
Combinatory logic is a notation introduced by Moses Sch?nfinkel and Haskell Curry to eliminate the need for variables in mathematical logic. It has more recently been used in computer science as a theoretical model of computation and also as a basis for the design of functional programming languages.... , is commonly perceived as more abstract than lambda calculus and preceded it in invention. It is used in some esoteric languages including Unlambda
Unlambda
Unlambda is a minimal functional programming language programming language invented by David Madore. It is based on combinatory logic, a version of the lambda calculus that omits the lambda operator.... .
Combinatory logic and lambda calculus were both originally developed to achieve a clearer approach to the foundations of mathematics.
Lisp is a family of computer programming languages with a long history and a distinctive, fully parenthesized syntax. Originally specified in 1958, Lisp is the second-oldest high-level programming language in widespread use today; only Fortran is older.... , developed by John McCarthy
John McCarthy (computer scientist)
John McCarthy , is an United States computer scientist and cognitive scientist who received the Turing Award in 1971 for his major contributions to the field of Artificial Intelligence .... while at MIT
Massachusetts Institute of Technology
The Massachusetts Institute of Technology is a private university research university located in Cambridge, Massachusetts, Massachusetts, United States.... for the IBM 700/7000 series
IBM 700/7000 series
The IBM 700/7000 series was a series of large scale computer systems made by International Business Machines through the 1950s and early 1960s.... scientific computers in the late 1950s. LISP introduced many features now found in functional languages, though LISP is technically a multi-paradigm language. Scheme and Dylan
Dylan programming language
The Dylan programming language is a multi-paradigm language that includes support for Functional programming and Object-oriented programming programming, and is dynamic programming language and Reflection while providing a programming model designed to support efficient machine code generation, including fine-grained control over dynamic and... were later attempts to simplify and improve LISP.
Information Processing Language is a programming language developed by Allen Newell, Cliff Shaw, and Herbert Simon at RAND Corporation and the Carnegie Institute of Technology from about 1956.... (IPL) is sometimes cited as the first computer-based functional programming language. It is an assembly-style language for manipulating lists of symbols. It does have a notion of "generator", which amounts to a function accepting a function as an argument, and, since it is an assembly-level language, code can be used as data, so IPL can be regarded as having higher-order functions. However, it relies heavily on mutating list structure and similar imperative features.
Kenneth Eugene Iverson was a Canadian computer scientist noted for the development of the APL programming language in 1962. He was honored with the Turing Award in 1979 for his contributions to mathematical notation and programming language theory.... developed the APL programming language
APL programming language
APL is an array programming language based on a notation invented in 1957 by Kenneth E. Iverson while at Harvard University. It originated as an attempt to provide consistent notation for the teaching and analysis of topics related to the application of computers.... in the early 1960s, described in his 1962 book A Programming Language (ISBN 9780471430148). APL was the primary influence on John Backus
John Backus
For the physicist, see John Backus John Warner Backus was an American computer scientist. He led the team that invented the first widely used High-level programming language programming language and was the inventor of the Backus-Naur form , the almost universally used notation to define formal language syntax.... 's FP programming language
FP programming language
FP is a programming language created by John Backus to support the function-level programming paradigm. This allows for the elimination of named variables.... . In the early 1990s, Iverson and Roger Hui
Roger Hui
Roger Hui is co-developer of the J . He was born in Hong Kong in 1953 and he immigrated to Canada with his entire family in 1966.... created a successor to APL, the J programming language. In the mid 1990s, Arthur Whitney, who had previously worked with Iverson, created the K programming language, which is used commercially in financial industries.
For the physicist, see John Backus John Warner Backus was an American computer scientist. He led the team that invented the first widely used High-level programming language programming language and was the inventor of the Backus-Naur form , the almost universally used notation to define formal language syntax.... presented the FP programming language
FP programming language
FP is a programming language created by John Backus to support the function-level programming paradigm. This allows for the elimination of named variables.... in his 1977 Turing Award
Turing Award
The A. M. Turing Award is given annually by the Association for Computing Machinery to "an individual selected for contributions of a technical nature made to the computing community.... lecture . 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
Principle of compositionality
In mathematics, semantics, and philosophy of language, the Principle of Compositionality is the principle that the meaning of a complex expression is determined by the meanings of its constituent expressions and the rules used to combine them.... . Backus's paper popularized research into functional programming, though it emphasized function-level programming
Function-level programming
In computer science, function-level programming refers to one of the two contrasting programming paradigms identified by John Backus in his work on programs as mathematical objects, the other being value-level programming.... rather than the lambda-calculus style which has come to be associated with functional programming.
ML is a general-purpose functional programming language developed by Robin Milner and others in the late 1970s at the University of Edinburgh, whose syntax is inspired by ISWIM.... was created by Robin Milner
Robin Milner
Arthur John Robin Gorell Milner Fellow of the Royal Society FRSE is a prominent British computer scientist.... at the University of Edinburgh
University of Edinburgh
The University of Edinburgh founded in 1582, is an internationally renowned centre for teaching and research in Edinburgh, Scotland, United Kingdom.... , and David Turner
David Turner (computer scientist)
Professor David Turner is a United Kingdom computer scientist.He has a D.Phil. from the University of Oxford. He has held professorships at Queen Mary, University of London, University of Texas at Austin and the University of Kent, where he now retains the post of Emeritus Professor.... developed initially the language SASL
SASL
SASL may refer to:* Simple Authentication and Security Layer, a framework for authentication and data security in Internet protocols* SASL , a non-strict functional programming language developed by David Turner in 1976... at the University of St. Andrews and later the language Miranda
Miranda programming language
Miranda is a lazy evaluation purely functional programming programming language designed by David Turner as a successor to his earlier programming languages SASL programming language and KRC, using some concepts from ML and Hope .... at the University of Kent
University of Kent
The University of Kent is a plate glass university Campus university university in Kent, England.... . ML eventually developed into several dialects, the most common of which are now Objective Caml
Objective Caml
Objective Caml, or OCaml is the main implementation of the Caml programming language, created by Xavier Leroy, J?r?me Vouillon, Damien Doligez, Didier R?my and others in 1996.... and Standard ML
Standard ML
Standard ML is a general-purpose, Module , functional programming language with compile-time type checking and type inference. It is popular among compiler writers and programming language researchers, as well as in the development of automated theorem proving.... . Also in the 1970s, the development of the Scheme programming language
Scheme programming language
Scheme is a multi-paradigm programming language. It is one of the two main programming language dialect of Lisp programming language and supports a number of programming paradigms but is best known for its support of functional programming.... (a partly-functional dialect of Lisp), as described in the influential Lambda Papers
Lambda Papers
Lambda the Ultimate Papers were written by Gerald Jay Sussman and Guy Steele Jr. in 1975-1978, questioning the then current practices in programming language implementations.... and the 1985 textbook Structure and Interpretation of Computer Programs
Structure and Interpretation of Computer Programs
Structure and Interpretation of Computer Programs is a textbook published in 1985 about general computer programming concepts from MIT Press written by Massachusetts Institute of Technology professors Harold Abelson and Gerald Jay Sussman, with Julie Sussman.... , brought awareness of the power of functional programming to the wider programming-languages community.
Per Erik Rutger Martin-L?f is a Sweden logician, philosopher, and mathematician. He is best known for developing intuitionistic type theory as a constructive foundation of mathematics.... developed Intuitionistic type theory
Intuitionistic type theory
Intuitionistic type theory, or constructive type theory, or Martin-L?f type theory or just Type Theory is a logical system and a set theory based on the principles of mathematical constructivism.... (also called Constructive type theory), which associated functional programs with constructive proof
Constructive proof
In mathematics, a constructive proof is a method of mathematical proof that demonstrates the existence of a mathematical object with certain properties by creating or providing a method for creating such an object.... s of arbitrarily complex mathematical propositions expressed as dependent type
Dependent type
In computer science and logic, a dependent type is a type which depends on a value. Dependent types play a central role in intuitionistic type theory and in the design of experimental functional programming languages like Dependent ML and Epigram .... s. This led to powerful new approaches to interactive theorem proving
Interactive theorem proving
Interactive theorem proving is the field of computer science and mathematical logic concerned with tools to develop formal proofs by man-machine collaboration.... and has influenced the development of many subsequent functional programming languages.
Haskell is a standardized, purely functional programming language with non-strict programming language, named after logician Haskell Curry. The goals of the language are described as:... was released in the late 1980s in an attempt to gather together many ideas in functional programming research.
Concepts
A number of concepts and paradigms are specific to functional programming, and generally foreign to imperative programming
Imperative programming
In computer science, imperative programming is a programming paradigm that describes computation in terms of statement s that change a program state .... (including object oriented programming). However, programming languages are often hybrids of several programming paradigms so programmers using "mostly imperative" languages may have utilized some of these concepts.
Higher-order functions
Functions are higher-order when they can take other functions as arguments, and return them as results. (Operator
Operator
In mathematics, an operator is a function which operates on another function. Often, an "operator" is a function which acts on functions to produce other functions ; or it may be a generalization of such a function, as in linear algebra, where some of the terminology reflects the origin of the subject in operations on the functions which ar... s in mathematics, such as the differential operator
Differential operator
In mathematics, a differential operator is an operator defined as a function of the derivative operator. It is helpful, as a matter of notation first, to consider differentiation as an abstract operation, accepting a function and returning another .... that produces the derivative
Derivative
In calculus, a branch of mathematics, the derivative is a measure of how a function changes as its input changes. Loosely speaking, a derivative can be thought of as how much a quantity is changing at a given point.... in calculus
Calculus
Calculus is a branch of mathematics that includes the study of limit , derivatives, integrals, and infinite series, and constitutes a major part of modern university education.... when applied to a function , are examples of this.)
In computer science, a programming language is said to support first-class functions if it treats function s as first-class objects. Specifically, this means that the language supports constructing new functions during the execution of a program, storing them in data structures, passing them as arguments to other functions, and returning the... s, 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 that describes 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).
In computer science, currying, invented by Moses Sch?nfinkel and Gottlob Frege, and independently by Haskell Curry, is the technique of transforming a function that takes multiple parameter in such a way that it can be called as a chain of functions each with a single argument.... , a technique in which a function is applied to its arguments one at a time, with each application returning a new function that accepts the next argument.
Purely functional is a term in computing used to describe algorithms, data structures or programming languages that exclude destructive modifications .... functions (or expressions) have no memory or I/O side effects
Side effect (computer science)
In computer science, a subroutine or expression is said to produce a side effect if it modifies some state_ in addition to returning a value. For example, a function might modify a global or a static variable, modify one of its arguments, write data to a display or file, or read some data from other side-effecting functions.... , unless the computation of the result in itself is counted as a side-effect. This means that pure functions have several useful properties, many of which can be used to optimize the code:
If the result of a pure expression is not used, it can be removed without affecting other expressions.
If a pure function is called with parameters that cause no side-effects, the result is constant with respect to that parameter list (sometimes called referential transparency), i.e. if the pure function is again called with the same parameters, the same result will be returned (this can enable caching optimisations such as memoization
Memoization
In computing, memoization is an Optimization technique used primarily to speed up computer programs by having Subroutine avoid repeating the calculation of results for previously-processed inputs.... ).
If there is no data dependency between two pure expressions, then their order can be reversed, or they can be performed in parallel and they cannot interfere with one another (in other terms, the evaluation of any pure expression is thread-safe
Thread-safe
Thread safety is a computer programming concept applicable in the context of multi-threaded programs. A piece of code is thread-safe if it functions correctly during simultaneous execution by multiple threads.... ).
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
Deforestation (computer science)
In the theory of programming languages in computer science, deforestation is a program transformation to eliminate tree structures.The term "deforestation" was originally coined by Philip Wadler in his paper "Deforestation: transforming programs to eliminate trees".... ).
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 optimisations that involve those external functions. Some compilers, such as gcc
GNU Compiler Collection
The GNU Compiler Collection is a compiler system produced by the GNU Project supporting various programming languages. GCC is a key component of the GNU toolchain.... , add extra keywords for a programmer to explicitly mark external functions as pure, to enable such optimisations. Fortran 95 allows functions to be designated "pure".
Iteration means the act of repeating.... (looping) in functional languages is usually accomplished via recursion
Recursion
Recursion, in mathematics and computer science, is a method of defining Function in which the function being defined is applied within its own definition.... . Recursive function
Recursion (computer science)
Recursion is a way of thinking about and solving problems. In fact, Recursion_ is one of the central ideas of computer science. Solving a problem using recursion means the solution depends on solutions to smaller instances of the same problem.... s invoke themselves, allowing an operation to be performed over and over. Recursion may require maintaining a stack, but tail recursion
Tail recursion
In computer science, tail recursion is a special case of Recursion_ in which the last operation of the function, the tail call, is a recursive call.... can be recognized and optimized by a compiler into the same code used to implement iteration in imperative languages. The Scheme programming language standard requires implementations to recognize and optimize tail recursion. Tail recursion optimization can be implemented by transforming the program into continuation passing style during compilation, among other approaches.
Common patterns of recursion can be factored out using higher order functions, catamorphism
Catamorphism
In category theory, the concept of catamorphism denotes the unique homomorphism for an initial algebra. The concept has been applied to functional programming.... s and anamorphism
Anamorphism
Anamorphosis is a distorted projection or perspective requiring the viewer to use special devices or occupy a specific vantage point to reconstitute the image.... s (or "folds" and "unfolds") being the most obvious examples. Such higher order functions play a role analogous to built-in control structures such as loop
Loop
A loop is generally something that closes back on itself such as a circle. The closing can appear in time or in space.... s in imperative languages.
Most general purpose functional programming languages allow unrestricted recursion and are Turing complete, which makes the halting problem
Halting problem
In computability theory , the halting problem is a decision problem which can be stated as follows: given a description of a computer program and a finite input, decide whether the program finishes running or will run forever, given that input.... undecidable
Undecidable
Undecidable has more than one meaning:In mathematical logic:* A decision problem is called undecidable if no algorithm can decide it, such as for Alan Turing's halting problem; see also under Decidable and Undecidable problem.... , can cause unsoundness of equational reasoning, and generally requires the introduction of inconsistency into the logic expressed by the language's type system
Type system
In computer science, a type system may be defined as "a tractable syntactic method for proving the absence of certain program behaviors by classifying phrases according to the kinds of values they compute.".... . Some special purpose languages such as Coq
Coq
In computer science, Coq is a proof assistant application. It allows the expression of mathematics assertions, mechanically checks proofs of these assertions, helps to find formal proofs, and extracts a certified program from the constructive proof of its formal specification.... allow only well-founded recursion and are strongly normalizing (nonterminating computations can be expressed only with infinite streams of values called codata). 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
Total functional programming
Total functional programming is a computer programming paradigm which restricts the range of programs to those which are provably terminating.... . See Turner 2004 for more discussion.
Strict versus non-strict evaluation
Functional languages can be categorized by whether they use strict or non-strict evaluation, concepts that refer to how function arguments are processed when an expression is being evaluated. The technical difference is in the denotational semantics
Denotational semantics
In computer science, denotational semantics is an approach to formalizing the meanings of programming languages by constructing mathematical objects which describe the meanings of expressions from the languages.... of expressions containing failing or divergent computations. Under strict evaluation, the evaluation of any term containing a failing subterm will itself fail. For example, the expression
print length([2+1, 3*2, 1/0, 5-4])
will fail under strict evaluation because of the division by zero in the third element of the list. Under nonstrict evaluation, the length function will return the value 4, since evaluating it will not attempt to evaluate the terms making up the list. In brief, strict evaluation always fully evaluates function arguments before invoking the function. Non-strict evaluation does not evaluate function arguments unless their values are required to evaluate the function call itself.
The usual implementation strategy for non-strict evaluation in functional languages is graph reduction
Graph reduction
In computer science, graph reduction implements an efficient version of non-strict evaluation, an evaluation strategy where the arguments to a function are not immediately evaluated.... . Non-strict evaluation is used by default in several pure functional languages, including Miranda, Clean and Haskell
Haskell (programming language)
Haskell is a standardized, purely functional programming language with non-strict programming language, named after logician Haskell Curry. The goals of the language are described as:... .
Hughes 1984 argues for non-strict (lazy) evaluation as a mechanism for improving program modularity through separation of concerns
Separation of concerns
In computer science, separation of concerns is the process of breaking a computer program into distinct features that overlap in functionality as little as possible.... , by easing independent implementation of producers and consumers of data streams. Launchbury 1993 describes some difficulties that lazy evaluation introduces, particularly in analyzing a program's storage requirements, and proposes an operational semantics
Operational semantics
In computer science, operational semantics is a way to give meaning to computer programs in a mathematically rigorous way. Other approaches to providing a formal semantics of programming languages include axiomatic semantics and denotational semantics.... to aid in such analysis.
Harper 2009 proposes including both strict and nonstrict evaluation in the same language, using the language's type system to distinguish them.
Type systems and pattern matching
Especially since the development of Hindley-Milner type inference in the 1970s, functional programming languages have tended to use typed lambda calculus
Typed lambda calculus
A typed lambda calculus is a typed formalism that uses the lambda-symbol to denote anonymous function abstraction. Typed lambda calculi are foundational programming languages and are the base of typed functional programming languages such as ML programming language and Haskell and, more indirectly, typed imperative programming.... , as opposed to the untyped lambda calculus used in Lisp and its variants (such as Scheme). The use of algebraic datatypes and pattern matching
Pattern matching
In computer science, pattern matching is the act of checking for the presence of the constituents of a given pattern. In contrast to pattern recognition, the pattern is rigidly specified.... makes manipulation of complex data structures more convenient and expressive; the presence of strong compile-time type checking makes programs more reliable, while type inference
Type inference
Type inference, or implicit typing, refers to the ability to deduce automatically the type of a value in a programming language. It is a feature present in some strongly-typed programming language static typing#Static and dynamic typing languages.... frees the programmer from the need to manually declare types to the compiler.
Some research-oriented functional languages such as Coq
Coq
In computer science, Coq is a proof assistant application. It allows the expression of mathematics assertions, mechanically checks proofs of these assertions, helps to find formal proofs, and extracts a certified program from the constructive proof of its formal specification.... , Agda, Cayenne, and Epigram are based on Intuitionistic type theory
Intuitionistic type theory
Intuitionistic type theory, or constructive type theory, or Martin-L?f type theory or just Type Theory is a logical system and a set theory based on the principles of mathematical constructivism.... , which allows types to depend on terms. Such types are called dependent type
Dependent type
In computer science and logic, a dependent type is a type which depends on a value. Dependent types play a central role in intuitionistic type theory and in the design of experimental functional programming languages like Dependent ML and Epigram .... s. These type systems do not have decidable type inference and are difficult to understand and program with. But dependent types can express arbitrary propositions in predicate logic
Predicate logic
In mathematical logic, predicate logic is the generic term for symbolic formal systems like first-order logic, second-order logic, many-sorted logic or infinitary logic.... . Through the Curry-Howard isomorphism, then, well-typed programs in these languages become a means of writing formal mathematical proof
Mathematical proof
In mathematics, a proof is a convincing demonstration that some mathematical statement is necessarily true. Proofs are obtained from deductive reasoning, rather than from inductive reasoning or empirical arguments.... s from which a compiler can generate certified code
Formal verification
In the context of hardware and software systems, formal verification is the act of Mathematical proof or disproving the correctness of intended algorithms underlying a system with respect to a certain formal specification or property, using formal methods of mathematics.... . While these languages are primarily of interest in academic research (including in formalized mathematics), they have begun to be used in engineering as well. Compcert is a compiler
Compiler
A compiler is a computer program that transforms source code written in a programming language into another computer language . The most common reason for wanting to transform source code is to create an executable program.... for a subset of the C programming language that is written in Coq and formally verified.
Generalized Algebraic Data Types are generalizations of the algebraic data types of Haskell and ML programming language, applying to parametric types.... s (GADT's) can be implemented in a way that provides some of the benefits of dependently-typed programming while avoiding most of its inconvenience. GADT's are available in the Glasgow Haskell Compiler
Glasgow Haskell Compiler
The Glorious Glasgow Haskell Compilation System, more commonly known as the Glasgow Haskell Compiler or GHC, is an open source Machine language compiler for the functional programming Computer programming Programming language Haskell .... and in Scala (as "case classes"), and have been proposed as additions to other languages including Java and C#.
Functional programming in non-functional languages
It is possible to employ a functional style of programming in languages that are not traditionally considered functional languages. Some non-functional languages have borrowed features such as higher-order functions, and list comprehensions from functional programming languages. This makes it easier to adopt a functional style when using these languages. Functional constructs such as higher-order functions and lazy lists can be obtained in C++ via libraries. In C, function pointers can be used to get some of the effects of higher-order functions. For example the common function map
Map (higher-order function)
In many programming languages, map is the name of a higher-order function that applies a Procedural parameter to a sequence of elements and returns a sequence of results.... can be implemented using function pointers. In C# version 3.0 and higher, lambda functions can be employed to write programs in a functional style. In Java
Java (programming language)
Java is a programming language originally developed by James Gosling at Sun Microsystems and released in 1995 as a core component of Sun Microsystems' Java .... , anonymous classes can sometimes be used to simulate closures, however anonymous classes cannot always be proper replacements to closures because they have more limited capabilities.
A design pattern in architecture and computer science is a formal way of documenting a solution to a design problem in a particular field of expertise.... s are expressible in functional programming terms: for example, the Strategy pattern
Strategy pattern
In computer programming, the strategy pattern is a particular design pattern , whereby algorithms can be selected at runtime.In some programming languages, such as those without Polymorphism , the issues addressed by this pattern are handled through forms of Reflection , such as the native function pointer or function Delegation syntax.... simply dictates use of a higher-order function, and the Visitor pattern roughly corresponds to a Catamorphism
Catamorphism
In category theory, the concept of catamorphism denotes the unique homomorphism for an initial algebra. The concept has been applied to functional programming.... , or fold
Fold (higher-order function)
In functional programming, fold, also known variously as reduce, accumulate, compress or inject, is a family of higher-order functions that process a data structure in some order and build up a return value.... .
The benefits of immutable data can be seen even in imperative programs, so programmers often strive to make some data immutable even in imperative programs.
Comparison of functional and imperative programming
In computer science, imperative programming is a programming paradigm that describes computation in terms of statement s that change a program state .... . The most significant differences stem from the fact that functional programming avoids side effects
Side effect (computer science)
In computer science, a subroutine or expression is said to produce a side effect if it modifies some state_ in addition to returning a value. For example, a function might modify a global or a static variable, modify one of its arguments, write data to a display or file, or read some data from other side-effecting functions.... , which are used in imperative programming to implement state and I/O. Pure functional programming disallows side effects completely. Disallowing side effects provides for referential transparency, which makes it easier to verify, optimize, and parallelize programs, and easier to write automated tools to perform those tasks.
Higher order functions are rarely used in older imperative programming. Where a traditional imperative program might use a loop to traverse a list, a functional style would often use a higher-order function, map, that takes as arguments a function and a list, applies the function to each element of the list, and returns a list of the results.
Simulating state
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.
The pure functional programming language Haskell implements them using monads
Monads in functional programming
In functional programming, a monad is a kind of abstract data type used to represent computations . Programs written in functional style can make use of monads to structure procedures that include sequenced operations, or to define arbitrary control flows .... , derived from category theory
Category theory
In mathematics, category theory deals in an abstract way with mathematical structures and relationships between them: it abstracts from set s and function s to objects linked in diagrams by morphisms or arrows.... . Monads are powerful and 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 find them difficult to understand conceptually, e.g., when asked to define new monads (which is sometimes needed for certain types of libraries).
Hoare logic is a formal system developed by the British computer scientist C. A. R. Hoare, and subsequently refined by Hoare and other researchers.... and uniqueness
Uniqueness type
In computing, a unique type guarantees that an object is used in a single-threaded way, with at most a single reference to it. If a value has a unique type, a function applied to it can be made to update the value in-place in the object code.... have been developed to track side effects in programs. Some modern research languages use effect system
Effect system
An effect system is a formal system which describes the computational effects of computer programs, such as side effect s. An effect system can be used to provide a compile-time checking of the possible effects of the program.... s to make explicit the presence of side effects.
Efficiency issues
Functional programming languages have been perceived as less efficient in their use of CPU
Central processing unit
A central processing unit is an electronic circuit that can execute computer programs. This broad definition can easily be applied to many early computers that existed long before the term "CPU" ever came into widespread usage.... and memory than imperative languages such as C and Pascal. However, for programs that perform intensive numerical computations, functional languages such as OCaml and Clean are similar in speed to C
C (programming language)
C is a general-purpose computer programming language originally developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories to implement the Unix operating system.... . For programs that handle large matrices
Matrix (mathematics)
In mathematics, a matrix is a rectangular array of numbers, as shown at the right. In addition to a number of elementary, entrywise operations such as matrix addition a key notion is matrix multiplication.... and multidimensional database
Database
A database is a structured collection of records or data that is stored in a computer system. The structure is achieved by organizing the data according to a database model.... s, array
Array programming
In computer science, array programming languages generalize operations on scalar s to apply transparently to vector s, matrix , and higher dimensional arrays.... functional languages (such as J and K) were designed with speed optimization in mind.
Purely functional languages have a reputation for being slower than imperative languages. However, immutability of data can, in many cases, lead to execution efficiency in allowing the compiler to make assumptions that are unsafe in an imperative language, vastly increasing opportunities for inlining
Inline expansion
In computing, inline expansion, or inlining, is a compiler optimization that replaces a function call site with the body of the callee. This optimization may improve time and space usage at runtime, at the possible cost of increasing the size of the final program.... ..
In computer programming, lazy evaluation is the technique of delaying a computation until such time as the result of the computation is known to be needed.... 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 when used improperly).
Coding styles
Imperative programs tend to emphasize the series of steps taken by a program in carrying out an action, while functional programs tend to emphasize the composition and arrangement of functions, often without specifying explicit steps. A simple example of two solutions to the same programming goal (using the same multi-paradigm language Python
Python (programming language)
Python is a general-purpose high-level programming language. Its design philosophy emphasizes code readability. Python's core syntax and semantics are Minimalism , while the standard library is large and comprehensive.... ) illustrates this.
imperative style
target = [] # create empty list
for item in source_list: # iterate over each thing in source
trans1 = G(item) # transform the item with the G function
trans2 = F(trans1) # second transform with the F function
target.append(trans2) # add transformed item to target
A functional version has a different feel to it:
functional style
FP-oriented languages often have standard compose
compose2 = lambda A, B: lambda x: A(B(x)) # Define how to apply two generic transformations
target = map(compose2(F, G), source_list) # Apply two specific functions F and G to each item in source
In contrast to the imperative style that describes the steps involved in building target, the functional style describes the mathematical relationship between source_list and target.
In practice in Python that code is often written with a list comprehension
List comprehension
A list comprehension is a Syntax of programming languages construct available in some programming languages for creating a list based on existing lists.... , a form of syntactic sugar
Syntactic sugar
Syntactic sugar is a term coined by Peter J. Landin for additions to the syntax of a computer language that do not affect its Function but make it "sweeter" for humans to use.... for the for loop with implicit append:
Harold Abelson is the Class of 1922 Professor of MIT Electrical Engineering and Computer Science Department at Massachusetts Institute of Technology, a fellow of the IEEE, and is a founding director, both of Creative Commons and the Free Software Foundation.... and Sussman, Gerald Jay
Gerald Jay Sussman
Gerald Jay Sussman is the Panasonic Professor of Electrical engineering at the Massachusetts Institute of Technology . He received his Bachelor of Science and Doctor of Philosophy degrees in mathematics from MIT in 1968 and 1973 respectively.... . Structure and Interpretation of Computer Programs
Structure and Interpretation of Computer Programs
Structure and Interpretation of Computer Programs is a textbook published in 1985 about general computer programming concepts from MIT Press written by Massachusetts Institute of Technology professors Harold Abelson and Gerald Jay Sussman, with Julie Sussman.... . MIT Press, 1985.
Cousineau, Guy and Michel Mauny. The Functional Approach to Programming. Cambridge, UK: Cambridge University Press
Cambridge University Press
Cambridge University Press is a printer and publisher granted a Royal Letters Patent by Henry VIII of England in 1534. It is the world's oldest continually operating book publisher.... , 1998.
Curry, Haskell Brooks and Feys, Robert and Craig, William. Combinatory Logic. Volume I. North-Holland Publishing Company, Amsterdam, 1958.
Curry, Haskell Brooks and Hindley, J. Roger and Seldin, Jonathan P. Combinatory Logic. Volume II. North-Holland Publishing Company, Amsterdam * London, 1972.
Higher-Order Perl , ISBN 1-55860-701-3 , is a book written by Mark Jason Dominus with the goal to teach Perl programmers with a strong C and Unix background how to use techniques with roots in functional programming languages like Lisp programming language that are available in Perl as well, but less known.... . Morgan Kaufman. 2005.
Felleisen, Matthias, Robert Findler, Matthew Flatt, and Shriram Krishnamurthi. How to Design Programs HTDP. MIT Press. 2001.
Graham, Paul. ANSI Common LISP. Englewood Cliffs, New Jersey: Prentice Hall
Prentice Hall
Prentice Hall is a leading educational publisher. It is an imprint of Pearson Education, Inc., based in Upper Saddle River, New Jersey, United States.... , 1996.
MacLennan, Bruce J. Functional Programming: Practice and Theory. Addison-Wesley, 1990.
O'Sullivan, Brian; Stewart, Don; and Goerzen, John. Real World Haskell. O'Reilly, 2008.
Pratt, Terrence, W. and Marvin V. Zelkowitz. Programming Languages: Design and Implementation. 3rd ed. Englewood Cliffs, New Jersey: Prentice Hall
Prentice Hall
Prentice Hall is a leading educational publisher. It is an imprint of Pearson Education, Inc., based in Upper Saddle River, New Jersey, United States.... , 1996.
Salus, Peter H. Functional and Logic Programming Languages. Vol. 4 of Handbook of Programming Languages. Indianapolis, Indiana: Macmillan Technical Publishing, 1998.
Thompson, Simon. Haskell: The Craft of Functional Programming. Harlow, England: Addison-Wesley Longman Limited, 1996.
External links
An introduction by Slava Akhmechet
[ftp://ftp.aw.com/cseng/authors/finkel/apld/finkel04.pdf "Functional Programming"] — Chapter 4 of Advanced Programming Language Design by Raphael Finkel
Raphael Finkel
Raphael Finkel is an American computer science and a professor at the University of Kentucky. He compiled the first version of the Jargon File.... , an introductory explanation of functional programming
David Mertz is an author and columnist for IBM's developerWorks, Intel Developer Services, O'Reilly Media, and other online publications. He is a member of the Python Software Foundation and maintains Gnosis Utilities, a widely used public domain Python package.... ): , ,
Simon Peyton Jones is a British computer scientist who researches the implementation and application software of functional programming languages, particularly lazy evaluation.... , published by Prentice Hall, 1987.