Functional Programming Functional Programming Equational Reasoning Recursion Principles and Foldables