Type Inference Monad

newtype IM i c ans = ...
type TI i = IM i (TypeConstraint i)
type KI i = IM i KindConstraint
IM is a combination of standard monads, providing A class for conventient generation of unique names:
class Fresh a where
  fresh :: IM i c a