<div dir="ltr"><div><br></div>I decided this could usefully be a feature, rather than a bug:<div><a href="https://mail.haskell.org/pipermail/hugs-bugs/2022-September/001929.html">https://mail.haskell.org/pipermail/hugs-bugs/2022-September/001929.html</a><br></div><div><br></div><div>So I meshed it with work-in-progress on overlaps; and on allowing instances inconsistent with FunDeps providing an overlap is strictly more specific; and in looking to FunDep's determining positions only for detecting overlap. So this now is accepted (`trexRemv` returns its first argument, removing any fields whose labels are common with its second arg):</div><div><br></div><div><br></div><div>></div>>    import Hugs.Trex<br><div>></div><div>>    class TrexRemv r1 r2 rr  | r1 r2 -> rr  where<br>>        trexRemv :: Rec r1 -> Rec r2 -> Rec rr<br>>    <br>>    instance TrexRemv EmptyRow r2 EmptyRow  where<br>>        trexRemv _empty _r2 = emptyRec<br>>  <br>>    instance (r1'\x, r2'\x, TrexRemv r1' ( x :: _b | r2') rr', rr'\x )<br>>             => TrexRemv ( x :: a | r1') ( x :: _b | r2') rr' <br>>      where                         <br>>        trexRemv ( x = x | r1') r2 = trexRemv r1' r2 <br>>  <br>>    instance (r1'\x, r2\x, TrexRemv r1' r2 rr', rr'\x )<br>>             => TrexRemv ( x :: a | r1') r2 ( x :: a | rr' ) <br>>      where<br>>        trexRemv ( x = x | r1') r2 = ( x = x | trexRemv r1' r2 )<br>><br>>    instance (r1'\y, r2'\y, TrexRemv r1' ( y :: _b | r2') rr', rr'\y )<br>>             => TrexRemv ( y :: a | r1') ( y :: _b | r2') rr' <br>>      where<br>>        trexRemv ( y = y | r1') r2 = trexRemv r1' r2<br>>  <br>>    instance (r1'\y, r2\y, TrexRemv r1' r2 rr', rr'\y )<br>>             => TrexRemv ( y :: a | r1') r2 ( y :: a | rr' )  <br>>      where   <br>>        trexRemv ( y = y | r1') r2 = ( y = y | trexRemv r1' r2 )<br></div><div>></div><div><br></div><div><br></div><div>For each specific label, the instance heads overall are in no substitution ordering -- because the label appears in the result just in case it _doesn't_ appear in the second arg. The new rule is to consider only the argument (first two) positions.</div><div><br></div><div>For each distinct label, the heads unify: the common instance has both labels. The new rule is that if heads differ in having distinct labels in corresponding positions, treat them as apart. (Or equivalently treat them as overlapping in strict alphabetic order of labels. So you can write instances in any sequence; they'll get loaded to alpha seq.)</div><div><br></div><div>As I said in that maybe-bug report</div><div><br></div><div><br></div><div>>></div><div>>> <span style="color:rgb(0,0,0);white-space:pre-wrap">it's Trex where records are considered isomorphic up to </span><span style="color:rgb(0,0,0);white-space:pre-wrap">permutation of labels;</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">>> and because each instance has an `EqRecRow b` </span><span style="color:rgb(0,0,0);white-space:pre-wrap">constraint for the rest of the row;</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">>> it doesn't matter how Hugs resolves the </span><span style="color:rgb(0,0,0);white-space:pre-wrap">wanted to the instances</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">>></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">[s/EqRecRow/TrexRemv/]</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">Similar to `remv` there's classes for `proj`(ect) and `app`(end) of rows with distinct labels, needing these overlap rules.</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">So along with the Trex syntax for rows, I now have an expressively complete set of operations. Nice-to-have would be generating these instances on-the-fly -- as Hugs does for `Eq, Show`. That looks hard.</span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap"><br></span></div><div><span style="color:rgb(0,0,0);white-space:pre-wrap">AntC</span></div><div><br></div></div>