Supponiamo di avere il seguente codice, dove una coppia di tipi finiscono per essere posto all'interno di altri due tipi, il più esterno dei quali è un GADT:Haskell: Utilizzando l'istanza corretta per un tipo avvolto in un altro tipo
{-# LANGUAGE FlexibleInstances,
GADTSyntax,
GADTs,
OverlappingInstances,
StandaloneDeriving #-}
data SomeType1 = SomeType1 deriving Show
data SomeType2 = SomeType2 deriving Show
class SomeClass d where
instance SomeClass SomeType1 where
instance SomeClass SomeType2 where
data WrapperType t where
WrapperType :: (SomeClass t, Show t) => t -> (WrapperType t)
instance Show (WrapperType SomeType1) where
show (WrapperType d) = "correct"
instance Show (WrapperType t) where
show (WrapperType d) = "incorrect"
data ListWrap where
ListWrap :: [(WrapperType d)] -> ListWrap
deriving instance Show ListWrap
Ora, scrivendo [WrapperType SomeType1]
mi dà quello che voglio:
*MyModule> [WrapperType SomeType1]
[correct]
Ma non appena ho messo dentro ListWrap
ottengo il torto Show
esempio scelto per visualizzare i contenuti:
*MyModule> ListWrap [WrapperType SomeType1]
ListWrap [incorrect]
Deve esserci qualcosa nelle classi di tipi e/o GADT che non riesco a capire - quale potrebbe essere?
tipo di risoluzione di classe è fatto al momento della compilazione e con quella esistenziale, il tipo di 'd' in' d' WrapperType viene memorizzato all'interno del 'ListWrap' è un cosa runtime – jozefg
Può essere risolto con annotazioni di tipo manuale? (Inoltre, la risposta utile di seguito sembra essere stata cancellata prima che avessi la possibilità di leggerla correttamente, non so perché). –
L'ho eliminato perché l'ho inviato un po 'prematuramente, non funzionava ancora anche se si contabilizzano le informazioni sul tipo cancellato. L'ho appena annullato aggiungendo quel bit in più. –