tl;dr How do I get Class
to have kind (* -> *) -> Constraint
?
I have the following code:
{-# LANGUAGE ConstraintKinds, TypeFamilies, RankNTypes, MultiParamTypeClasses #-}
class MonadTrans t where
type Class t
lift :: (Monad m) => m b -> t m b
generalize :: (Monad m) => t m a -> (forall m'. (Class t m') => m a)
class (Monad m) => MaybeC m where
fart :: m a
data MaybeT m a = NothingT | JustT (m a)
instance (Monad m) => Monad (MaybeT m) where
return = JustT . return
(JustT a) >>= f = a >>= f
NothingT >>= f = NothingT
instance (Monad m) => MaybeC (MaybeT m) where
fart = NothingT
instance MonadTrans MaybeT where
type Class Maybe = MaybeC --Error Is HERE
lift = JustT
generalize NothingT = fart
generalize JustT a = return a
The compiler says: "Expected kind '* -> Constraint', but
MaybeC' has kind (* -> *) -> Constraint'</code>
" but Class
is (*->*)->Constraint
.
So then I tried:
{-# LANGUAGE ConstraintKinds, TypeFamilies, RankNTypes, MultiParamTypeClasses #-}
class MonadTrans t where
type Class t :: (*->*)->Constraint
lift :: (Monad m) => m b -> t m b
generalize :: (Monad m) => t m a -> (forall m'. (Class t m') => m a)
class (Monad m) => MaybeC m where
fart :: m a
data MaybeT m a = NothingT | JustT (m a)
instance (Monad m) => Monad (MaybeT m) where
return = JustT . return
(JustT a) >>= f = a >>= f
NothingT >>= f = NothingT
instance (Monad m) => MaybeC (MaybeT m) where
fart = NothingT
instance MonadTrans MaybeT where
type Class Maybe = MaybeC
lift = JustT
generalize NothingT = fart
generalize JustT a = return a
But the compiler says "pad1.hs:4:37: Not in scope: type constructor or class 'Constraint'
", so ConstraintKinds
is doing nothing for me.