<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">I like the sound of Michael’s definition.  Can we document it with the MonadFail class, so that people making instances can find it easily?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><br>
Simon<o:p></o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></a></p>
<span style="mso-bookmark:_MailEndCompose"></span>
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Libraries [mailto:libraries-bounces@haskell.org]
<b>On Behalf Of </b>Michael Snoyman<br>
<b>Sent:</b> 14 March 2018 14:31<br>
<b>To:</b> Ryan Scott <ryan.gl.scott@gmail.com><br>
<b>Cc:</b> Haskell Libraries <libraries@haskell.org><br>
<b>Subject:</b> Re: Proposal: Remove the bogus MonadFail instance for ST<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">One possible "well behaved" intuition could be "cannot result in an exception thrown from pure code without usage of unsafe functions." By this definition:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">* Maybe's fail is well behaved: using `fail "foo"` results in a total Nothing value<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">* List's: same thing, but with an empty list<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">* IO: runtime exception, but the exception is _not_ in pure code, but rather from within IO, where exceptions are always to be expected<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">* ST: `runST (fail "foo")` results in a pure value which, when evaluated, throws a runtime exception, breaking the well behaved definition<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">* Identity: `Identity (fail "foo")` can only be a pure value which throws an exception, and is therefore not well behaved<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Note that I added the requirement of "without usage of unsafe functions," since `unsafePerformIO (fail "foo")` can result in a pure bottom value.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Wed, Mar 14, 2018 at 4:25 PM, Ryan Scott <<a href="mailto:ryan.gl.scott@gmail.com" target="_blank">ryan.gl.scott@gmail.com</a>> wrote:<o:p></o:p></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<p class="MsoNormal">Thanks, that makes more sense. I'm inclined to agree that MonadFail<br>
instances should fail in a "well-behaved" way. (I wish I knew how to<br>
make the phrase "well-behaved" more formal, but I don't.) It might be<br>
worth adding this intuition to the Haddocks for MonadFail.<br>
<br>
That being said, one thing to consider before removing this instance<br>
is that there will be some breakage. Ben Gamari added this instance in<br>
[1] because apparently the regex-tdfa package needed it. Other than<br>
that, though, I don't have any real objections to removing this<br>
instance.<br>
<br>
Ryan S.<br>
-----<br>
[1] <a href="https://phabricator.haskell.org/D3982" target="_blank">https://phabricator.haskell.org/D3982</a><o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><br>
On Wed, Mar 14, 2018 at 9:58 AM, David Feuer <<a href="mailto:david.feuer@gmail.com">david.feuer@gmail.com</a>> wrote:<br>
> I expect a MonadFail instance to have a well-behaved notion of failure<br>
> within the monad. An exception from "pure" code (which is what ST<br>
> simulates) is not that. On the other hand, perhaps you're right and<br>
> the instance should be removed for IO as well; I don't have as strong<br>
> a sense of revulsion, but maybe users should be forced to be explicit<br>
> with throwIO.<br>
><br>
> On Wed, Mar 14, 2018 at 9:46 AM, Ryan Scott <<a href="mailto:ryan.gl.scott@gmail.com">ryan.gl.scott@gmail.com</a>> wrote:<br>
>> OK. You used the phrase "utterly contrary to the purpose of<br>
>> MonadFail", so I'm trying to figure out exactly what you mean here.<br>
>> Prima facie, the purpose of MonadFail (at least, as explained in its<br>
>> Haddocks) is to provide a type class–directed way of desugaring<br>
>> partial pattern matches in do-notation. With this in mind, the current<br>
>> MonadFail instance for ST doesn't seem too offensive.<br>
>><br>
>> However, I think you have some additional property in mind that you<br>
>> feel the MonadFail ST instance runs afoul of. Do you mind explaining<br>
>> in further detail what this is? (I'm not trying to be snarky here—I<br>
>> genuinely don't know what you're getting at.)<br>
>><br>
>> Ryan S.<br>
>><br>
>> On Wed, Mar 14, 2018 at 9:41 AM, David Feuer <<a href="mailto:david.feuer@gmail.com">david.feuer@gmail.com</a>> wrote:<br>
>>> I am not. I think that instance is fairly legitimate, as it raises an<br>
>>> IO exception that can be caught in IO. IO's Alternative instance is a<br>
>>> bit shadier, but that's not a topic for this proposal either. ST is an<br>
>>> entirely different story, and I'm sorry I accidentally mixed it in.<br>
>>><br>
>>> On Wed, Mar 14, 2018 at 9:05 AM, Ryan Scott <<a href="mailto:ryan.gl.scott@gmail.com">ryan.gl.scott@gmail.com</a>> wrote:<br>
>>>> It's worth noting that the MonadFail instance for IO [1] also simply throws<br>
>>>> an error (by way of failIO). Are you proposing we remove this instance as<br>
>>>> well?<br>
>>>><br>
>>>> Ryan S.<br>
>>>> -----<br>
>>>> [1]<br>
>>>> <a href="http://git.haskell.org/ghc.git/blob/cb6d8589c83247ec96d5faa82df3e93f419bbfe0:/libraries/base/Control/Monad/Fail.hs#l80" target="_blank">
http://git.haskell.org/ghc.git/blob/cb6d8589c83247ec96d5faa82df3e93f419bbfe0:/libraries/base/Control/Monad/Fail.hs#l80</a><br>
>>>><br>
>>>> _______________________________________________<br>
>>>> Libraries mailing list<br>
>>>> <a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br>
>>>> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" target="_blank">
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><br>
>>>><br>
_______________________________________________<br>
Libraries mailing list<br>
<a href="mailto:Libraries@haskell.org">Libraries@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries</a><o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>