This document provides an introduction to functional programming, including definitions, history, features, and concepts. It defines functional programming as using immutable values and functions as the core constructs, with no variables and side effects. Historically, it originated from lambda calculus in the 1930s. It discusses taxonomies of functional languages and features like recursion, higher-order functions, and monads. It provides guidance on when functional programming is well-suited (stateless transformations) and not well-suited (GUIs with state). Resources for further learning in F# and Haskell are also listed.