В 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
Это почти работает, но пользователь должен применить последнюю часть, а компилятор должен сделать это за меня. Кроме того, этот случай не позволяет выбрать третий вариант, когда выполняются оба ограничения.
Как логически объединить два ограничения?