Haskell では、型の制約を論理 AND と組み合わせることができます。
次のことを考慮してください
type And (a :: Constraint) b = (a, b)
またはより複雑に
class (a, b) => And a b
instance (a, b) => And a b
Haskell で 2 つの制約を論理的に結合する方法を知りたいです。
私の最も近い試みはこれですが、うまくいきません。この試みでは、型制約をタグで具体化し、暗黙的なパラメーターでそれらを非具体化します。
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
ほとんど動作しますが、ユーザーは最終部分を適用する必要があり、コンパイラーがそれを行う必要があります。同様に、このケースでは、両方の制約が満たされている場合、3 番目の選択肢を選択できません。
論理的に、または 2 つの制約をまとめるにはどうすればよいですか?