在 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
它几乎可以工作,但用户必须应用最后一部分,编译器应该为我做这件事。同样,当两个约束都满足时,这种情况不会让人们选择第三种选择。
我怎样才能在逻辑上或两个约束在一起?