A language that supports only functional programming and does not allow functions to have side-effects. Program execution consists of evaluation of an expression and all subexpressions are referentially transparent.