Functional programming is a programming paradigm that conceives computation as the evaluation of mathematical functions and avoids state and mutable data.
Functional programming emphasizes the application of functions, in contrast to imperative programming, which emphasizes changes in state and the execution of sequential commands.
Functional programming is defined more by a set of common concerns and themes than any list of distinctions from other paradigms.
Often considered important are higher-order and first-class functions, closures, and recursion.
Other common features of functional programming languages are continuations, Hindley-Milner type inference systems, non-strict evaluation (including, but not limited to, "laziness"), and monads.