Monads for functional programming
call - by - name , call - by - value and the lambda - calculus .