Ответ 1
Вы можете сделать это, используя трюк Олега, у которого даже есть своя библиотека на хакете
Тяжело злоупотребляя системой класса типов, можно создать fundep
class TypeEq a b result | a b -> result
такое, что TypeEq a b True
только тогда, когда a~b
и TypeEq a b False
иначе
чтобы вы могли написать
instance (TypeEq () a False) => T a
и я думаю, что это должно сработать. Я должен быть ясным, этот тест равенства типа является чистым злом в том, как он реализуется, но он в основном работает. Ознакомьтесь с кодом для этой библиотеки, если вы хотите понять, как это работает/обобщает его (также читайте документ HList).
Если вы вообще можете делать то, что хотите, без отрицательного ограничения, сделайте это вместо этого.