Я пишу XML (de) сериализатор, используя Text.XML.Light и Scrap ваш Boilerplate (на http://github.com/finnsson/Text.XML.Generic)), и до сих пор я получил рабочий код для "нормальных" ADT, но я застрял в десериализации экзистенциалы.
Я получил экзистенциальный тип данных
data DataBox where
DataBox :: (Show d, Eq d, Data d) => d -> DataBox
и я пытаюсь заставить это скомпилировать
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
но я не могу понять, как реализовать gunfold
для DataBox
.
Сообщение об ошибке
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)
Он жалуется на невозможность определить тип данных b
.
Я также пытаюсь реализовать dataCast1
и dataCast2
, но я думаю, что я могу жить без них (то есть неправильная реализация).
Наверное, мои вопросы:
- Можно ли объединить экзистенциалы с утилитой Boilerplate?
- Если так: как вы реализуете складывание оружия для экзистенциального типа данных?