module Problem3.Eval_expanded where
{-
-- Short answer:
  Eval1 a  ~=  Store -> Either Err (a, Store)
  Eval2 a  ~=  Store -> (Either Err a, Store)
-}

{-
-- Details:

  CMS.StateT s m a  ~=  s -> m (a, s)
  CME.ErrorT e m a  ~=  m (Either e a)
  CMI.Identity a    ~=  a
-}

{-
newtype Eval1 a = Eval1{ unEval1 :: CMS.StateT Store (CME.ErrorT Err CMI.Identity) a }

   Eval1 a
~= Store -> (CME.ErrorT Err CMI.Identity) (a, Store)
~= Store -> CMI.Identity (Either Err (a, Store))
~= Store -> Either Err (a, Store)
-}

{-
newtype Eval2 a = Eval2{ unEval2 :: CME.ErrorT Err (CMS.StateT Store CMI.Identity) a }

   Eval2 a
~= CME.ErrorT Err (CMS.StateT Store CMI.Identity) a
~= (CMS.StateT Store CMI.Identity) (Either Err a)
~= Store -> CMI.Identity (Either Err a, Store)
~= Store -> (Either Err a, Store)
-}