2010-05-15 10 views
8

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 gunfoldDataBox.

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:

  1. ¿Es posible combinar los existenciales con chatarra de su plancha de caldera?
  2. En caso afirmativo: ¿cómo se implementa una doble cara para un tipo de datos existencial?

Respuesta

6

¿Es posible combinar GADTs con chatarra de su plancha de caldera?

Creo que tendrás que preguntarle a haskell-cafe @. Esta es posiblemente una pregunta de investigación.

+0

+1: http://www.mail-archive.com/[email protected]/msg75780.html –

+0

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

Cuestiones relacionadas