> import Prelude hiding (div) > import qualified Prelude ------------------------------------------------------------ Language E + div exception + monadic exception threading (2) ------------------------------------------------------------ > instance Monad Value where > return x = Value x > x >>= f = case x of Exception e -> Exception e > Value x -> f x > data Value a = Value a | Exception String deriving Show > add :: Int -> Int -> Value Int > add x y = return (x + y) > sub :: Int -> Int -> Value Int > sub x y = return (x - y) > div :: Int -> Int -> Value Int > div x y = if y==0 then Exception "Divide by zero" > else return (x `Prelude.div` y) > mul :: Int -> Int -> Value Int > mul x y = return (x * y) ------------------------------------------------------------ Examples ------------------------------------------------------------ x = Value 3 > x = add 1 2 y = Value 17 > y = do a <- mul 3 4 > add a 5 z = Exception "Exception: Divide by zero" > z = div 1 0 w = Exception "Exception: Divide by zero" > w = do a <- div 1 0 > add 1 a v = 42 > v = do a <- add 4 3 > b <- add 2 4 > mul a b