In
computer science,
functional programming is a
programming paradigm that treats
computation as the evaluation of
mathematical functions and avoids
state and
mutable data. It emphasizes the application of functions, in contrast to the
imperative programming style, which emphasizes changes in state.
[1] Functional programming has its roots in the
lambda calculus, a
formal system developed in the 1930s to investigate function definition, function application, and
recursion. Many functional
programming languages can be viewed as embellishments to the
lambda calculus.
[1]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, 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.[1]
Functional programming languages, especially purely functional ones, have largely been emphasized in academia rather than in commercial software development. However, notable functional programming languages used in industrial and commercial applications by multiple organizations include Erlang,[2] OCaml,[3][4] Haskell,[5] Scheme[6][7][8][9], and domain-specific programming languages like R (statistics),[10] Mathematica (symbolic math),[11] J and K (financial analysis), and XSLT (XML).[12][13] Widespread declarative domain specific languages like SQL and Lex/Yacc, use some elements of functional programming, especially in eschewing mutable values.[14] Spreadsheets can also be viewed as functional programming languages.[15]
Programming in a functional style can be accomplished in languages that aren't specifically designed for functional programming, including C, C++, Python, Ruby, Java, or JavaScript.