Как я могу объединить два ограничения типа с логическим или в Haskell?

В 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

Это почти работает, но пользователь должен применить последнюю часть, а компилятор должен сделать это за меня. Кроме того, этот случай не позволяет выбрать третий вариант, когда выполняются оба ограничения.

Как логически объединить два ограничения?

12
задан ehird 21 April 2012 в 01:23
поделиться