Экзистенциалы и скрап - PullRequest
8 голосов
/ 15 мая 2010

Я пишу 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, но я думаю, что я могу жить без них (то есть неправильная реализация).

Наверное, мои вопросы:

  1. Можно ли объединить экзистенциалы с утилитой Boilerplate?
  2. Если так: как вы реализуете складывание оружия для экзистенциального типа данных?

1 Ответ

6 голосов
/ 15 мая 2010

Возможно ли объединить ГАДЦ с отходами вашего котла?

Я думаю, вам нужно спросить haskell-cafe @. Возможно, это вопрос исследования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...