10

Foo型が関連付けられた型クラスがあります。

{-# LANGUAGE TypeFamilies #-}

class Foo a where
    type Bar a
    foo :: a -> Bar a

ここで、関連付けられた型の 1 つを保持するデータ型を定義し、そのShowインスタンスを派生させたいと考えています。

data Baz a = Baz (Bar a) deriving (Show)

Showただし、インスタンスがあることを保証できないため、これはコンパイルされません。Bar a

No instance for (Show (Bar a))
  arising from the 'deriving' clause of a data type declaration

次のように手動インスタンスをオンにFlexibleContextsUndecidableInstancesて書き込むことで問題を解決できますShow

{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}

data Baz a = Bar a

instance (Show a, Show (Bar a)) => Show (Baz a) where
    showsPrec _ (Baz x) = showString "Baz " . shows x

しかし、それは特に満足のいくものではありません。特に、Bazが 1 つの値の単純なラッパーよりも複雑な場合や、他の型クラスのインスタンスも派生させたい場合はそうです。抜け道はありますか?

4

1 に答える 1

15

を使用して、これまでと同じインスタンスStandaloneDerivingを生成するようGHCに依頼できますが、コンテキストは異なります:Show

{-# LANGUAGE FlexibleContexts, StandaloneDeriving, TypeFamilies, UndecidableInstances #-}

class Foo a where
    type Bar a
    foo :: a -> Bar a

data Baz a = Baz (Bar a)
deriving instance Show (Bar a) => Show (Baz a)
于 2012-10-30T17:57:53.443 に答える