Kind inference can't infer and Constraint Kinds does nothing

902 views Asked by At

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', butMaybeC' 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.

0

There are 0 answers