<div dir="ltr"><br><br><div class="gmail_quote">On Sat, Dec 5, 2009 at 10:33 PM, José Iborra <span dir="ltr">&lt;<a href="mailto:pepeiborra@gmail.com">pepeiborra@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im"><br>
On Dec 5, 2009, at 6:58 PM, Michael Snoyman wrote:<br>
<br>
&gt; Hi all,<br>
&gt;<br>
&gt; Well, I&#39;ve got two problems which both want to be solved with undecidable and overlapping instances. Obviously, I&#39;d like to try and avoid them. For the record, the problems have to do with the control-monad-failure and convertible packages. The code below *should* make clear what I&#39;m trying to accomplish:<br>

&gt;<br>
&gt; -- failure should not be limited to just monads, so...<br>
&gt; class Failure e f where<br>
&gt;     failure :: e -&gt; f v<br>
&gt; class (Functor f, Failure e f) =&gt; FunctorFailure e f<br>
&gt; instance (Functor f, Failure e f) =&gt; FunctorFailure e f -- undecidable, overlaps<br>
&gt; class (Applicative f, Failure e f) =&gt; ApplicativeFailure e f<br>
&gt; instance (Applicative f, Failure e f) =&gt; ApplicativeFailure e f -- undecidable, overlaps<br>
&gt; class (Monad f, Failure e f) =&gt; MonadFailure e f<br>
&gt; instance (Monad f, Failure e f) =&gt; MonadFailure e f -- undecidable, overlaps<br>
&gt;<br>
<br>
</div>(Functor|Monad|Applicative)Failure are little more than class synonyms, right ?<br>
Or equivalently, do you envision the need of writing, say, a MonadFailure instance for a type A which which works differently than the existing Failure instance for A?<br>
If the answer is no as I presume, then you don&#39;t want overlapping instances.<br>
<br>
Regarding undecidable instances, I will say that from my point of view they do not constitute a language extension.<br>
MPTCs are the language extension here. Since MPTCs can lead to non-terminating type checking,<br>
a compiler can either allow any use of them, employ a termination prover to ensure that only well-behaved instances are defined,<br>
or impose a set of restrictions that ensure termination. GHC does the latter, rather conservatively in some cases, and undecidable<br>
instances is just a compiler flag that puts the burden of termination checking on the user.<br>
<br>
In this case it is obvious that non-termination is not going to be a problem for the instances defined above.<br>
Since you have already decided MPTCs are ok, in my opinion undecidable instances are fine here.<br>
But I realize this is not the usual stance, so I might be wrong.<br>
<div class="im"><br></div></blockquote><div>Sounds reasonable to me. I&#39;m waiting for the boogey man to jump out though and explain why undecidables here will get me gored to death by a raptor [1]. <br></div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">
<br>
&gt; And now the convertible issue. I want two type classes: Convert for anything which *might* be convertible, but might not. For example, sometimes a String can be converted to an Int (like the string &quot;5&quot;), but sometimes it will fail (like &quot;five&quot;). TotalConvert is when something *is* convertible, such as Int to String (simply the show function). Thus the following:<br>

&gt;<br>
&gt; class Convert x y where<br>
&gt;     convert :: x -&gt; Maybe y<br>
&gt; class Convert x y =&gt; TotalConvert x y where<br>
&gt;     totalConvert :: x -&gt; y<br>
&gt; instance TotalConvert x y =&gt; Convert x y where -- Boom!<br>
&gt;     convert = Just . totalConvert<br>
<br>
<br>
</div>In this case Convert is not just a class synonym, so you are going to run into trouble with that code.<br>
<br>
I would do this as follows:<br>
<div class="im"><br>
class Convert x y =&gt; TotalConvert x y where<br>
    totalConvert :: x -&gt; y<br>
</div>    totalConvert = fromJust . convert<br>
<br>
For instance,<br>
<br>
instance Convert Integer Double where convert = Just . fromIntegral<br>
instance TotalConvert Double    -- that&#39;s all<br>
<br></blockquote><div>Interestng approach. The current approach is *almost* the same, just leaves off the default definition. I&#39;d be wary of putting in a definition like that; although it saves a line of typing, it let&#39;s a partial function get in which could cause trouble for unsuspecting users. But it is a possibility. <br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
Cheers,<br>
pepe</blockquote></div><br>[1] <a href="http://xkcd.com/292/">http://xkcd.com/292/</a><br></div>