Haskell では、次のようなインターフェイスがある場合
class Eq a => Lol l a b where
...
単純なインスタンスを宣言するにはどうすればよいですか? 次のようなことを試してみると
class Lol1 a b
instance Lol Lol1 A B
Lol の最初の引数には kind * -> * -> * が必要であるのに対し、Lol1 には kind が必要であると不平を言っています。
* -> * -> Constraint
Haskell では、次のようなインターフェイスがある場合
class Eq a => Lol l a b where
...
単純なインスタンスを宣言するにはどうすればよいですか? 次のようなことを試してみると
class Lol1 a b
instance Lol Lol1 A B
Lol の最初の引数には kind * -> * -> * が必要であるのに対し、Lol1 には kind が必要であると不平を言っています。
* -> * -> Constraint
あなたのプログラムの全範囲を知らなければ、これがあなたが望む解決策であるかどうかはわかりません。しかし、実際にクラスを使用して、クラスのインスタンス内の型として扱うことができます。
{-# 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