Предположим, мы определяем GADT для сравнения типов:
data EQT a b where
Witness :: EQT a a
Можно ли тогда объявить функцию eqt со следующей сигнатурой типа:
eqt :: (Typeable a, Typeable b) => a -> b -> Maybe (EQT a b)
...таким образом, что eqt xy оценивается как Just Witness, если typeOf x == typeOf y --- и в противном случае Nothing< /сильный>?
Функция eqt позволит преобразовать обычные полиморфные структуры данных в GADT.