A practical introduction to functional programming