Есть ли способ использовать синтаксический сахар для построения списков экзистенциальных типов?
Рассмотрим список, подобный этому:
{-# LANGUAGE ExistentialQuantification #-}
data ShowList = Nil | forall a. Show a => a :* ShowList
infixr 5 :*
myShowList :: ShowList
myShowList = 'x' :* () :* Nil
Я хотел бы иметь возможность использовать синтаксический сахар для создания таких списков:
myShowList :: ShowList
myShowList = ['x', ()]
Но даже с
RebindableSyntax
а также
OverloadedLists
, похоже, я застрял в использовании встроенного типа списка, что сбивает меня с толку, пытаясь объединить типы всех элементов:
$ ghci -XRebindableSyntax -XOverloadedLists
GHCi, version 9.2.1: https://www.haskell.org/ghc/ :? for help
ghci> fromListN = fromListN
ghci> myShowList = ['x', ()]
<interactive>:2:20: error:
• Couldn't match expected type ‘GHC.Types.Char’
with actual type ‘()’
• In the expression: ()
In the expression: ['x', ()]
In an equation for ‘myShowList’: myShowList = ['x', ()]
ghci> :info []
type [] :: * -> *
data [] a = [] | a : [a]
-- Defined in ‘GHC.Types’
ghci>
Есть ли способ обойти это, или я застрял писать их без сахара?