あなたのプログラムの全範囲を知らなければ、これがあなたが望む解決策であるかどうかはわかりません。しかし、実際にクラスを使用して、クラスのインスタンス内の型として扱うことができます。
{-# LANGUAGE
MultiParamTypeClasses,
KindSignatures,
ConstraintKinds,
FlexibleInstances,
UndecidableInstances
#-}
import GHC.Prim (Constraint)
class Lol1 a b -- Lol1 has kind * -> * -> Constraint
class Lol2 a -- Lol2 has kind * -> Constraint
-- Note the explicit 'kind' signature for type var 'l'. This is necessary
class Eq a => Lol (l :: * -> * -> Constraint) a b where
instance Eq b => Lol Lol1 b c
-- instance Eq b => Lol Lol2 b c -- won't work
data A; data B
クラスの 'type' 変数でできることは、それを使用して他の型変数を制約するか、別のクラスに渡すことだけです。
class (l a b) => Lol (l :: * -> * -> Constraint) a b where
instance Lol1 a b -- removing this breaks the line below
instance Lol Lol1 a b