У меня есть класс типа Foo
с ассоциированным типом:
{-# LANGUAGE TypeFamilies #-}
class Foo a where
type Bar a
foo :: a -> Bar a
Теперь я хочу определить тип данных, который содержит один из связанных типов, и получить экземпляр 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
является более сложным, чем простая оболочка вокруг одного значения или когда я также хочу получить экземпляры других классов типов. Есть ли выход?