В Haskell нам предоставляется возможность комбинировать ограничения для типов с логическим и.
Рассмотрим следующее
type And (a :: Constraint) b = (a, b)
или сложнее
class (a, b) => And a b
instance (a, b) => And a b
Я хочу знать, как логически или два ограничения вместе в Haskell.
Моя ближайшая попытка - это, но это не совсем работает. В этой попытке я повторяю ограничения типов с тегами и чем их разделяют с неявными параметрами.
data ROr a b where
L :: a => ROr a b
R :: b => ROr a b
type Or a b = (?choose :: ROr a b)
y :: Or (a ~ Integer) (Bool ~ Integer) => a
y = case ?choose of
L -> 4
x :: Integer
x = let ?choose = L in y
Он почти работает, но пользователь должен применить финальную часть, и компилятор должен сделать это для меня. Кроме того, этот случай не позволяет выбрать третий вариант, когда выполняются оба ограничения.
Как я могу логически или два ограничения вместе?