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
次のように手動インスタンスをオンにFlexibleContexts
しUndecidableInstances
て書き込むことで問題を解決できます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 つの値の単純なラッパーよりも複雑な場合や、他の型クラスのインスタンスも派生させたい場合はそうです。抜け道はありますか?