Подтвердить что ты не робот

Haskell - генерировать экземпляр для всех классов, кроме одного определенного типа

Можно ли сделать что-то вроде

class T a
class U a
instance U ()
instance ( NOT U a ) => T a

Контекст: я пытаюсь написать функцию, которая принимает HLists и удаляет элементы определенного типа (здесь тип единицы).

Я чувствую, что может быть какая-то проблема с предположением открытого мира, но даже будучи в состоянии сделать это жестко закодированным образом (вместо NOT U a, что-то вроде NOT a ~()) должно показаться возможным.

edit: Как указано в комментарии C.A. McMann, этот вопрос в значительной степени является точным дубликатом моего. Если модератор хочет закрыть это, не стесняйтесь.

4b9b3361

Ответ 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).

Если вы вообще можете делать то, что хотите, без отрицательного ограничения, сделайте это вместо этого.