symantic-6.0.0.20170623: Language/Symantic/Interpreting/Eval.hs
-- | Interpreter to evaluate a term as a host-term.
module Language.Symantic.Interpreting.Eval where
import Control.Monad
-- * Type 'Eval'
-- | Interpreter's data.
newtype Eval a = Eval { unEval :: a }
instance Functor Eval where
fmap f (Eval a) = Eval (f a)
instance Applicative Eval where
pure = Eval
(Eval f) <*> (Eval a) = Eval (f a)
instance Monad Eval where
return = Eval
(Eval a) >>= f = f a
-- | Interpreter.
eval :: Eval a -> a
eval = unEval
-- ** Constructors
eval0 :: a -> Eval a
eval0 = Eval
eval1 :: (a -> b) -> Eval a -> Eval b
eval1 = liftM
eval2 :: (a -> b -> c) -> Eval a -> Eval b -> Eval c
eval2 = liftM2
eval3 :: (a -> b -> c -> d) -> Eval a -> Eval b -> Eval c -> Eval d
eval3 = liftM3