@@ -4,6 +4,7 @@
4{-# LANGUAGE TemplateHaskell #-}
4{-# LANGUAGE TemplateHaskell #-}
5{-# LANGUAGE ConstraintKinds #-}
5{-# LANGUAGE ConstraintKinds #-}
6{-# LANGUAGE ScopedTypeVariables #-}
6{-# LANGUAGE ScopedTypeVariables #-}
7+{-# LANGUAGE LambdaCase #-}
7module Main where
8module Main where
9import Control.Ether.Tags
10import Control.Ether.Tags
@@ -13,6 +14,7 @@ import Control.Monad.Ether.Reader
13import Control.Monad.Ether.State
14import Control.Monad.Ether.State
14import qualified Control.Monad.Ether.Implicit.Reader as I
15import qualified Control.Monad.Ether.Implicit.Reader as I
15import qualified Control.Monad.Ether.Implicit.State as I
16import qualified Control.Monad.Ether.Implicit.State as I
17+import qualified Control.Monad.Ether.Implicit.Except as I
16import qualified Control.Monad.Reader as T
18import qualified Control.Monad.Reader as T
17import qualified Control.Monad.State as T
19import qualified Control.Monad.State as T
@@ -140,3 +142,28 @@ factorial a = I.runState (I.runReaderT recurseCore a) (0 :: Int)
141factorial' :: Int -> (Int, Int)
143factorial' :: Int -> (Int, Int)
142factorial' a = factorial (a :: Int)
144factorial' a = factorial (a :: Int)
146+data DivideByZero = DivideByZero
148+data NegativeLog = NegativeLog
152+ :: ( Floating a, Ord a
153+ , I.MonadExcept DivideByZero m
154+ , I.MonadExcept NegativeLog m
158+ then I.throw DivideByZero
162+ then I.throw NegativeLog
163+ else return $ log (a / b)
165+exceptCore' :: Double -> Double -> String
167+ = either (\NegativeLog -> "nl") id
169+ (either (\DivideByZero -> "dz") show <$> I.runExceptT (exceptCore a b))