Functional Programming is when functions, not objects or procedures, are the fundamental building blocks of a program.
- Pure: Haskell
- Impure: all the rest
- Clojure, Erlang
Whole programs or systems can be treated as functions, which can be readily composed if their inputs and outputs are well-defined PipeLine-s allowing easy composition of filters were so successful that it become a design pattern of operating systems. Imperative procedures with side effects violate referential transparency and therefore are not cleanly composable. However if you consider the "state of the world" before and after running the code as its input and output, you get a clean function. Composition of such functions corresponds to running the procedures one after the other. The Monad-s formalism uses this idea to incorporate side effects and I/O into functional languages. http://en.wikipedia.org/wiki/Function_composition_(computer_science)