<div dir="ltr"><div style="margin:0px;padding:0px;border:0px;color:rgb(34,34,34);font-family:arial,helvetica,sans-serif;font-size:13px"><div style="margin:0px;padding:0px;border:0px;overflow:auto"><div style="margin:0px;padding:0px;border:0px;max-height:10000px"><div dir="ltr" style="margin:0px;padding:0px;border:0px">Ahoy,<div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px">I have the following type class.</div><div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px"><div style="margin:0px;padding:0px;border:1px solid rgb(187,187,187);background-color:rgb(250,250,250);word-wrap:break-word"><code style="margin:0px;padding:0px;border:0px"><div style="margin:0px;padding:0px;border:0px"><font color="#660066" style="margin:0px;padding:0px;border:0px"><div style="margin:0px;padding:0px;border:0px">-- | An entity whose underlying information spans zero or more columns</div><div style="margin:0px;padding:0px;border:0px">class ResultEntity a where</div><div style="margin:0px;padding:0px;border:0px"><span style="margin:0px;padding:0px;border:0px;white-space:pre">  </span>-- | Build an instance of @a@.</div><div style="margin:0px;padding:0px;border:0px"><span style="margin:0px;padding:0px;border:0px;white-space:pre">  </span>parseEntity :: RowParser a</div><div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px"><span style="margin:0px;padding:0px;border:0px;white-space:pre"> </span>default parseEntity :: (EligibleDataType meta cons a) => RowParser a</div><div style="margin:0px;padding:0px;border:0px"><span style="margin:0px;padding:0px;border:0px;white-space:pre"> </span>parseEntity = parseGeneric</div></font></div></code></div><br>The <span style="margin:0px;padding:0px;border:0px;background-color:rgb(250,250,250);color:rgb(102,0,102);font-family:monospace">EligibleDataType</span> constraint allows me to construct a <span style="margin:0px;padding:0px;border:0px;background-color:rgb(250,250,250);color:rgb(102,0,102);font-family:monospace">RowParser</span> with the help of generics.</div><div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px">It is so minimal that I am considering to transform the hole thing into this.</div><div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px"><div style="margin:0px;padding:0px;border:1px solid rgb(187,187,187);background-color:rgb(250,250,250);word-wrap:break-word"><code style="margin:0px;padding:0px;border:0px"><div style="margin:0px;padding:0px;border:0px"><font color="#660066" style="margin:0px;padding:0px;border:0px"><div style="margin:0px;padding:0px;border:0px">-- | An entity whose underlying information spans zero or more columns</div><div style="margin:0px;padding:0px;border:0px">class ResultEntity a where</div><div style="margin:0px;padding:0px;border:0px"><span style="margin:0px;padding:0px;border:0px;white-space:pre">    </span>-- | Build an instance of @a@.</div><div style="margin:0px;padding:0px;border:0px"><span style="margin:0px;padding:0px;border:0px;white-space:pre">  </span>parseEntity :: RowParser a</div><div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px">instance {-# OVERLAPPABLE #-} (EligibleDataType meta cons a) => ResultEntity a where</div><div style="margin:0px;padding:0px;border:0px"><span style="margin:0px;padding:0px;border:0px;white-space:pre">       </span>parseEntity = parseGeneric</div></font></div></code></div><br>This makes defining new instances of <span style="margin:0px;padding:0px;border:0px;background-color:rgb(250,250,250);color:rgb(102,0,102);font-family:monospace">ResultEntity</span> obsolete for types that already satisfy the <span style="margin:0px;padding:0px;border:0px;background-color:rgb(250,250,250);color:rgb(102,0,102);font-family:monospace">EligibleDataType</span> constraint (basically everything that has a <span style="margin:0px;padding:0px;border:0px;color:rgb(102,0,102);font-family:monospace;background-color:rgb(250,250,250)">Generic</span> instance). It is still possible to provide a hand-rolled instance.</div><div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px">Undecidable and overlapping instances seem like a big no-no. Even after reading up on them, I can't get rid of the feeling that this might be dangerous.</div><div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px"><b>Is it dangerous?<span class="inbox-inbox-Apple-converted-space"> </span></b>I am targeting GHC 8.0.1 with this.<br></div><div style="margin:0px;padding:0px;border:0px"><br></div><div style="margin:0px;padding:0px;border:0px">- Ole</div></div></div></div></div></div>