Я пытаюсь обернуть свой мозг вокруг экзистенциальных типов Хаскелла, и мой первый пример - это разнородный список вещей, которые можно показать:
{-# LANGUAGE ExistentialQuantification #-}
data Showable = forall a. Show a => Showable a
showableList :: [Showable]
showableList = [Showable "frodo", Showable 1]
Теперь мне кажется, что следующее, что яхотел бы сделать это сделать Showable экземпляр Show так, чтобы, например, мой showableList мог отображаться в repl:
instance Show Showable where
show a = ...
Проблема, с которой я столкнулся, заключается в том, что я действительно хочу сделать здесьвызовите базовую реализацию a *1009* show .Но я испытываю затруднения, ссылаясь на это:
instance Show Showable where
show a = show a
выбирает Показываемый метод показа на 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так что Показываемое не должно заново изобретать колесо.