Sto scrivendo un serializzatore XML (de) utilizzando Text.XML.Light e Scrap your Boilerplate (a http://github.com/finnsson/Text.XML.Generic) e fino ad ora ho ottenuto codice funzionante per ADT "normali" ma sono bloccato a deserializzazione degli esistenziali.Existentials and Scrap your Boilerplate
ho avuto il tipo di dati esistenziale
data DataBox where
DataBox :: (Show d, Eq d, Data d) => d -> DataBox
e sto cercando di ottenere questo per compilare
instance Data DataBox where
gfoldl k z (DataBox d) = z DataBox `k` d
gunfold k z c = k (z DataBox) -- not OK
toConstr (DataBox d) = toConstr d
dataTypeOf (DataBox d) = dataTypeOf d
ma non riesco a capire come implementare gunfold
per DataBox
.
Il messaggio di errore è
Text/XML/Generic.hs:274:23:
Ambiguous type variable `b' in the constraints:
`Eq b'
arising from a use of `DataBox' at Text/XML/Generic.hs:274:23-29
`Show b'
arising from a use of `DataBox' at Text/XML/Generic.hs:274:23-29
`Data b' arising from a use of `k' at Text/XML/Generic.hs:274:18-30
Probable fix: add a type signature that fixes these type variable(s)
Si lamentano di non essere in grado di capire il tipo di dati di b
.
Sto anche provando a implementare dataCast1
e dataCast2
ma penso di poter vivere senza di loro (cioè un'implementazione errata).
Credo che le mie domande sono:
- E 'possibile combinare esistenziali con scarto tua Boilerplate?
- In caso affermativo: come si implementa l'elica per un tipo di dati esistenziali?
+1: http://www.mail-archive.com/[email protected]/msg75780.html –
Grazie per il suggerimento. La mia scommessa attuale è che José Pedro Magalhães aveva ragione, cioè la risposta a (1) è "no". – finnsson