Карта GType для функции, преобразующей тип в строку ввода-вывода

Эта карта находится между GType и функцией, которая преобразует экземпляр этого GType в строку ввода-вывода. Я делаю функцию, которая принимает элемент и получает строковое представление этого элемента.

mapping =
    [ (Types.gTypeHTMLSourceElement, HTMLSourceElement.getSrc   )
    , (Types.gTypeHTMLObjectElement, HTMLObjectElement.getData  )
    , (Types.gTypeHTMLTimeElement  , HTMLTimeElement.getDateTime)
    , (Types.gTypeHTMLElement      , HTMLElement.getInnerText   )
    , ...
    ]

Выдает эту ошибку:

Couldn't match type ‘HTMLObjectElement’ with ‘HTMLSourceElement’

Я использую GHCJS-DOM. Как я могу получить этот код для компиляции без ошибок? Правильно ли я подхожу к проблеме?

Если кто-то может придумать ответ лучше, чем ответ Алека, я приму его ответ.

1 ответ

Решение

Я думаю, что правильный способ подойти к проблеме - это просто toString функция, которая делает ветвление на основе GType.

toString :: GObjectClass obj => obj -> IO String
toString obj | obj `isA` gTypeHTMLSourceElement = getSrc . castToHTMLSourceElement
             | obj `isA` gTypeHTMLObjectElement = getData . castToHTMLObjectElement
             | obj `isA` gTypeHTMLTimeElement = getDateTime . castToHTMLTimeElement
             | obj `isA` gTypeHTMLElement = getInnerText . castToHTMLElement
             | ...
Другие вопросы по тегам