Estoy escribiendo un serializador XML (de) usando Text.XML.Light y chatarra tu Boilerplate (en http://github.com/finnsson/Text.XML.Generic) y hasta ahora tengo código de trabajo para ADTs "normales" pero estoy atrapado en deserializar los existencialesExistentials y chatarra tu Boilerplate
me dieron el tipo de datos existencial
data DataBox where
DataBox :: (Show d, Eq d, Data d) => d -> DataBox
y estoy tratando de conseguir que esto compilar
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
pero no puedo encontrar la manera de poner en práctica para gunfold
DataBox
.
El mensaje de error es
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)
Se queja de no ser capaz de averiguar el tipo de datos de b
.
También estoy tratando de implementar dataCast1
y dataCast2
pero creo que puedo vivir sin ellos (es decir, una implementación incorrecta).
Creo que mis preguntas son:
- ¿Es posible combinar los existenciales con chatarra de su plancha de caldera?
- En caso afirmativo: ¿cómo se implementa una doble cara para un tipo de datos existencial?
+1: http://www.mail-archive.com/[email protected]/msg75780.html –
Gracias por la sugerencia. Mi apuesta actual es que José Pedro Magalhães tenía razón, es decir, la respuesta a (1) es "no". – finnsson