In functional programming you express **truths**, and in imperative programming you express **steps**. Functional programming = haskell, scheme*, scala - A functional language (ideally) allows you to write a mathematical function, i.e. a function that takes n arguments and returns a value. A functional program always yields the same value for an input. Often recursive. Must be stateless, i.e. no operation can have side effects. Imperative programming = java - A sequence of commands that the computer carries out in a sequence. Object-oriented programming - These instructions, and the data they manipulate, are organized into objects Procedural programming = C, Go, Fortran. - Procedures (aka subroutines or functions) contain a series of computational steps to be carried out. A procedural routine is not guaranteed to yield the same value for an input. Routines have side effects, i.e. change and maintain state.