<div dir="ltr"><span style="font-size:12.8px">This is my first post here, so Hello everyone!</span><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">In haskell it is possible to express a constraint "if 'a' and 'b' are instance of 'AB' then 'a' is instance of 'A' and 'b' is instance of 'B'":</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><font face="monospace, monospace">class (A a, B b) => AB a b ...</font></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Is it possible to express the converse - "if 'a' is instance of 'A' and 'b' is instance of 'B' then 'a' and 'b' are instance of 'AB'"?</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I want to create a list of shapes that can be tested for intersection. I think that possibility of expressing such constraints would allow to doing this <span style="font-size:12.8px">in a "Object Oriented" way:</span></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><font face="monospace, monospace">data Circle = Circle { ... }</font></div><div style="font-size:12.8px"><font face="monospace, monospace">data Square = Square { ... }</font></div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">class Shape a</font></div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">class Intersect a b where</font></div><div style="font-size:12.8px"><font face="monospace, monospace">    intersect :: a -> b -> Bool</font></div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><div><font face="monospace, monospace">-- pseudo haskell - "If 'a' is instance of 'Shape' and 'b' is instance of 'Shape' then 'a' and 'b' are instance of 'Intersect'"<br></font></div><div><font face="monospace, monospace">-- maybe some type hackery allows to express this?</font></div><div><font face="monospace, monospace">constraint Shape a, Shape b => Intersect a b</font></div></div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">instance Shape Circle</font></div><div style="font-size:12.8px"><font face="monospace, monospace">instance Shape Square</font></div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">instance Intersect Circle Circle ...</font></div><div style="font-size:12.8px"><font face="monospace, monospace">instance Intersect Circle Square ...<br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">...</font></div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">data ShapeBox = forall a. Shape a => </font><span style="font-family:monospace,monospace;font-size:12.8px">ShapeBox</span><font face="monospace, monospace"> a</font></div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><font face="monospace, monospace">foo = let x:y:_ = [</font><span style="font-family:monospace,monospace;font-size:12.8px">ShapeBox</span><font face="monospace, monospace"> Circle { ... }, </font><span style="font-family:monospace,monospace;font-size:12.8px">ShapeBox</span><font face="monospace, monospace"> Square { ... }, ...]</font></div><div style="font-size:12.8px"><font face="monospace, monospace">      in intersect x y -- this should work because we know for sure that there is an instance of Intersect for type of 'x' and type of 'y'</font></div><div style="font-size:12.8px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8px"><font face="arial, helvetica, sans-serif">Is such idea already described somewhere?</font></div></div>