An introduction to functional programming