The Monad typeclass is best understood by looking at it from many perspectives. That is why this book has no definitive section or chapter on Monad. Instead, we will successively peel off the layers of this abstraction.
Let's begin by looking at a simple example of interpreting expressions:
data Expr = Lit Int | Div Expr Expr eval :: Expr -> Int eval (Lit a) = a eval (Div a b) = eval a `div` eval b
eval function interprets expressions written in our
Expr data type:
(eval (Lit 42)) –- 42 (eval (Div (Lit 44) (Lit 11))) -- 4
Stripped of real-world concerns, this is very elegant. Now let's add (naive) capability to deal with errors in our interpreter. Instead of the
eval function returning integers, we'll return a
Try data type, which caters ...