In Haskell ci viene data la possibilità di combinare i vincoli sui tipi con un logico e.Come posso combinare due vincoli di tipo con un logico o in Haskell?
Si consideri il seguente
type And (a :: Constraint) b = (a, b)
o più complicatamente
class (a, b) => And a b
instance (a, b) => And a b
Voglio sapere come logicamente o due vincoli insieme in Haskell.
Il mio tentativo più vicino è questo, ma non funziona. In questo tentativo, reifaggo i vincoli di tipo con i tag e li cancello con parametri impliciti.
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
Funziona quasi, ma l'utente deve applicare la parte finale e il compilatore dovrebbe farlo per me. Inoltre, questo caso non consente di scegliere una terza scelta quando entrambi i vincoli sono soddisfatti.
Come posso logicamente o due vincoli insieme?
Che dire di entrambi? Ti lascerebbe a disambiguare quando entrambi sono soddisfatti. –