您需要为ghc提供一种方法来构成该实例。一种方法是:
{-# LANGUAGE FlexibleContexts, RankNTypes #-}
data STLike s a = STLike a deriving (Eq)
class Box box where
runBox :: box a -> a
newtype Boxed box a = Boxed (box a)
instance (Box box, Eq a) => Eq (Boxed box a) where
Boxed a == Boxed b = runBox a == runBox b
run :: (Eq a, Box box) => (forall s. Eq (Boxed box (STLike s a))
=> box (STLike s a))
-> a
run box = case runBox box of STLike a -> a
我认为你不能有
instance Eq (box (STLike s a))
,所以有一个
上面不方便的新类型。