Есть ли способ использовать синтаксический сахар для построения списков экзистенциальных типов?

Рассмотрим список, подобный этому:

      {-# 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> 

Есть ли способ обойти это, или я застрял писать их без сахара?

0 ответов

Другие вопросы по тегам