import Language.Symantic.Lib.Bool (tyBool)
-- * Class 'Sym_Monad'
-type instance Sym (Proxy Monad) = Sym_Monad
+type instance Sym Monad = Sym_Monad
class Sym_Monad term where
return :: Monad m => term a -> term (m a)
(>>=) :: Monad m => term (m a) -> term (a -> m b) -> term (m b); infixl 1 >>=
instance (Sym_Monad term, Sym_Lambda term) => Sym_Monad (BetaT term)
-- Typing
+instance NameTyOf Monad where
+ nameTyOf _c = ["Monad"] `Mod` "Monad"
instance FixityOf Monad
instance ClassInstancesFor Monad
instance TypeInstancesFor Monad
-- Compiling
instance Gram_Term_AtomsFor src ss g Monad
-instance (Source src, Inj_Sym ss Monad) => ModuleFor src ss Monad where
- moduleFor _s = ["Monad"] `moduleWhere`
+instance (Source src, SymInj ss Monad) => ModuleFor src ss Monad where
+ moduleFor = ["Monad"] `moduleWhere`
[ "return" := teMonad_return
, "join" := teMonad_join
, "when" := teMonad_when
tyMonad :: Source src => Type src vs m -> Type src vs (Monad m)
tyMonad m = tyConstLen @(K Monad) @Monad (lenVars m) `tyApp` m
-m0 :: Source src => Inj_Len vs => Inj_Kind (K m) =>
+m0 :: Source src => LenInj vs => KindInj (K m) =>
Type src (Proxy m ': vs) m
m0 = tyVar "m" varZ
-m1 :: Source src => Inj_Len vs => Inj_Kind (K m) =>
+m1 :: Source src => LenInj vs => KindInj (K m) =>
Type src (a ': Proxy m ': vs) m
m1 = tyVar "m" $ VarS varZ
-m2 :: Source src => Inj_Len vs => Inj_Kind (K m) =>
+m2 :: Source src => LenInj vs => KindInj (K m) =>
Type src (a ': b ': Proxy m ': vs) m
m2 = tyVar "m" $ VarS $ VarS varZ
-m3 :: Source src => Inj_Len vs => Inj_Kind (K m) =>
+m3 :: Source src => LenInj vs => KindInj (K m) =>
Type src (a ': b ': c ': Proxy m ': vs) m
m3 = tyVar "m" $ VarS $ VarS $ VarS varZ