<div dir="auto">To the best of my knowledge, `InstanceSigs` are never strictly necessary. They can, however, be useful for at least four purposes:<div dir="auto"> </div><div dir="auto">1. To provide a compiler-checked reminder of the type.</div><div dir="auto">2. To bind type variables with `ScopedTypeVariables`.</div><div dir="auto">3. To generalize the type so you can use polymorphic recursion.</div><div dir="auto">4. To enhance parametricitry/polymorphism for internal documentation purposes.</div><div dir="auto"><br></div><div dir="auto">The third reason is probably the main technical one to allow a more general signature, but the fourth is likely helpful too.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Aug 8, 2021, 3:04 AM Anthony Clayden <<a href="mailto:anthony.d.clayden@gmail.com">anthony.d.clayden@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><font face="arial, sans-serif">I can't help but feel InstanceSigs are either superfluous or upside-down. It's this bit in the User Guide:</font><div><font face="arial, sans-serif"><br></font></div><div><span style="color:rgb(64,64,64);background-color:rgb(252,252,252)"><font face="arial, sans-serif">> The type signature in the instance declaration must be</font></span></div><div><font face="arial, sans-serif"><span style="color:rgb(64,64,64);background-color:rgb(252,252,252)">> more polymorphic </span><span style="background-color:rgb(252,252,252);color:rgb(64,64,64)">than (or the same as) the one in the class declaration,</span></font></div><div><font face="arial, sans-serif"><span style="color:rgb(64,64,64);background-color:rgb(252,252,252)">> instantiated with the instance type.</span><br></font></div><div><span style="color:rgb(64,64,64);background-color:rgb(252,252,252)"><font face="arial, sans-serif"><br></font></span></div><div><font face="arial, sans-serif"><span style="color:rgb(64,64,64);background-color:rgb(252,252,252)">Usually if you give a signature, it must be _less_ polymorphic (or the same as) </span><span style="background-color:rgb(252,252,252);color:rgb(64,64,64)">the type inferred from the term:</span></font></div><div><span style="color:rgb(64,64,64);background-color:rgb(252,252,252)"><font face="arial, sans-serif"><br></font></span></div><div><font face="arial, sans-serif">>    lessPolyPlus :: Integral a => a -> a -> a</font></div><font face="arial, sans-serif">>    lessPolyPlus x y = x + y</font><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Or</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">>    lessPolyPlus (x :: a) y = x + y :: Integral a => a<br></font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">The examples in the User Guide aren't helping: you could just drop the InstanceSigs, and all is well-typed. (Even the example alleging to use -XScopedTypeVariables in a where sub-decl: you could just put random `xs :: [b]` without scoping `b`.) </font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Dropping the Sigs altogether works because the type from the class decl, suitably instantiated, is less polymorphic than inferred from the term. IOW the suitably instantiated type restricts what would otherwise be inferred. Situation normal.</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">I suppose it might be helpful to give an explicit InstanceSig as 'belt and braces' for the instantiated -- possibly because the instantiation is hard to figure out; possibly because you want to use -XScopedTypeVariables within a where-bound sub-decl, as an extra piece of string.</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">I can see you mustn't make the InstanceSig _less_ polymorphic than the suitably instantiated.</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">But the docos don't give any example where it's essential to provide an InstanceSig _and_  make it strictly more polymorphic. Here all the sigs and annotations are just superfluous:</font></div><div><font face="arial, sans-serif"><br></font></div><font face="arial, sans-serif">>    maxPolyPlus :: Num a => a -> a -> a<br>>    maxPolyPlus = (+)<br>>    <br></font><div><font face="arial, sans-serif">>    class C a  where foo :: a -> T a<br>>    instance Integral a => C a  where<br>>      foo :: Num a => a -> T a<br>>      foo (x :: a) = MkT (maxPolyPlus x x :: Num a => a)<br></font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">Is there a persuasive example (to put in the User Guide)?</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">AntC</font></div><div><br></div></div>
_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org" target="_blank" rel="noreferrer">Glasgow-haskell-users@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users</a><br>
</blockquote></div>