Экзистенциальные типы Haskell

Я пытаюсь осмыслить экзистенциальные типы Haskell, и мой первый пример представляет собой разнородный список вещей, которые можно показать:

{-# LANGUAGE ExistentialQuantification #-}
data Showable = forall a. Show a => Showable a

showableList :: [Showable]
showableList = [Showable "frodo", Showable 1]

Теперь мне кажется, что следующее, что я хотел бы сделать Showable экземпляром Show, чтобы, например, мой showableList мог отображаться в ответе:

instance Show Showable where
  show a = ...

Проблема, с которой я столкнулся, заключается в том, что я действительно хочу здесь назвать a В основе показана реализация . Но у меня возникли проблемы со ссылкой на него:

instance Show Showable where
  show a = show a

выбирает метод show Showable на RHS, который работает по кругу. Я пробовал автоматически выводить Show, но это не сработало:

data Showable = forall a. Show a => Showable a
  deriving Show

дает мне:

Can't make a derived instance of `Show Showable':
  Constructor `Showable' does not have a Haskell-98 type
  Possible fix: use a standalone deriving declaration instead
In the data type declaration for `Showable'

Я ищу способ вызвать базовую реализацию Show :: show, чтобы Showable не имел изобретать велосипед.

8
задан Josh Lee 28 November 2011 в 15:47
поделиться