0

Haskell では、次のようなインターフェイスがある場合

class Eq a => Lol l a b where
    ...

単純なインスタンスを宣言するにはどうすればよいですか? 次のようなことを試してみると

class Lol1 a b
instance Lol Lol1 A B

Lol の最初の引数には kind * -> * -> * が必要であるのに対し、Lol1 には kind が必要であると不平を言っています。

* -> * -> Constraint
4

3 に答える 3

0

あなたのプログラムの全範囲を知らなければ、これがあなたが望む解決策であるかどうかはわかりません。しかし、実際にクラスを使用して、クラスのインスタンス内の型として扱うことができます。

{-# 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
于 2013-09-20T20:38:11.277 に答える