<div dir="ltr">In parsing libraries for Haskell the "parse" function (or its equivalent) typically returns an Either. For instance there's<br><br><div><a name="v:parse" class="" style="margin:0px;padding:0px;font-weight:bold;color:rgb(0,0,0);font-family:monospace;font-size:13px;line-height:16.12px">parse</a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px;line-height:16.12px;background-color:rgb(240,240,240)"> :: </span><a href="http://hackage.haskell.org/package/parsec-3.1.6/docs/Text-Parsec-Prim.html#t:Stream" style="margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;font-size:13px;line-height:16.12px">Stream</a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px;line-height:16.12px;background-color:rgb(240,240,240)"> s </span><a href="http://hackage.haskell.org/package/transformers-0.4.1.0/docs/Data-Functor-Identity.html#t:Identity" style="margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;font-size:13px;line-height:16.12px">Identity</a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px;line-height:16.12px;background-color:rgb(240,240,240)"> t => </span><a href="http://hackage.haskell.org/package/parsec-3.1.6/docs/Text-Parsec-Prim.html#t:Parsec" style="margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;font-size:13px;line-height:16.12px">Parsec</a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px;line-height:16.12px;background-color:rgb(240,240,240)"> s () a -> </span><a href="http://hackage.haskell.org/package/parsec-3.1.6/docs/Text-Parsec-Pos.html#t:SourceName" style="margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;font-size:13px;line-height:16.12px">SourceName</a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px;line-height:16.12px;background-color:rgb(240,240,240)">-> s -> </span><a href="http://hackage.haskell.org/package/base-4.7.0.1/docs/Data-Either.html#t:Either" style="margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;font-size:13px;line-height:16.12px">Either</a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px;line-height:16.12px;background-color:rgb(240,240,240)"> </span><a href="http://hackage.haskell.org/package/parsec-3.1.6/docs/Text-Parsec-Error.html#t:ParseError" style="margin:0px;padding:0px;text-decoration:none;color:rgb(171,105,84);font-family:monospace;font-size:13px;line-height:16.12px">ParseError</a><span style="color:rgb(0,0,0);font-family:monospace;font-size:13px;line-height:16.12px;background-color:rgb(240,240,240)"> a</span><br></div><div><br></div><div>in Text.Parsec.Prim. This is an example of making invalid state impossible. parse could return a list of all possible parses, with the empty list signifying that parsing failed. But by using an Either, the case of failure can be distinguished as a Left. Haskell will know to treat the Left differently, and if you need an error report, that left can bubble (through multiple Either-returning functions, with some handy do-notation) up to the user without ever invoking an exception to the ordinary control flow.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 27, 2015 at 12:51 PM, Dennis Raddle <span dir="ltr"><<a href="mailto:dennis.raddle@gmail.com" target="_blank">dennis.raddle@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Fri, Nov 27, 2015 at 10:31 AM, Jeffrey Brown <span dir="ltr"><<a href="mailto:jeffbrown.the@gmail.com" target="_blank">jeffbrown.the@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Elliot Cameron, very smart guy, once advised me to make illegal state invalid. Jake Brownson, another, recommended trying to use Maybes and Eithers instead of throwing exceptions. I'm having trouble coming up with examples but I think they're both helpful.<div><br></div></div></blockquote><div><br></div></span><div>I think I know roughly what you are talking about, but there are places where unexpected input might result in something like an empty list. Suppose I need the head of that list under normal conditions. Maybe the list is produced by library code so I can't alter the data structures. That's the kind of situation I want to identify precisely and immediately.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>D</div><div><br></div><div><br></div></font></span></div></div></div>
<br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Jeffrey Benjamin Brown</div></div>
</div>