Functors and Monads
Functors are containers that have value and if you apply a function to that value you get the same kind of container with the value inside of it transformed.
Expressions vs Statements
One fundamental difference between imperative and functional style is that the first one relies heavily on statements to accomplish everything, while functional code relies on expressions.
Pure function is function with no side effects and its result is determined only by the input arguments.
The signature of an honest function must convey all information about the possible input values and the possible outcome it may produce.