Infinite lists
fmap :: (a -> b) -> f a -> f b
fmap (+3) (Just 2) -- Just 5
(+3) <$> Just 2 -- Just 5
pure :: x -> a x
apply :: a (x -> y) -> a x -> a y
pure 2 -- Just 2
apply (Just (+3)) (Just 2) -- Just 5
Just (+3) <*> Just 2 -- Just 5
bind :: m a -> (a -> m b) -> m b
half x = if even x then Just (x `div` 2) else Nothing
bind (Just 10) half -- Just 5
pure 40 >>= half >>= half >>= half -- ?
Division - Maybe Monad
IO Monad