<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 27, 2015 at 2:51 PM, 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">In parsing libraries for Haskell the "parse" function (or its equivalent) typically returns an Either. For instance there's<br><br><div><a name="1514b258d17cb0e3_v:parse" 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" target="_blank">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" target="_blank">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" target="_blank">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" target="_blank">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" target="_blank">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" target="_blank">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></blockquote><div><br></div><div><br></div><div>I've used the Either monad for exception handling. Yes, I was using do notation. This current project is just for myself. Exceptions represent either bugs or malformed input. I can catch some of them in the IO monad so my program prints an error but keeps running and lets me try again. If the program crashes out, no big problem. </div><div><br></div><div>I'm parsing MusicXML with Text.XML.Light. The XML is always well-formed. However *MusicXML* is not a well-defined language. Like, does every <note> element have a child element called <voice>? No guarantee I can find, yet it has been true in the examples I've tried with the only typesetter I'm using to generate MusicXML.  I can get my program running quickly without bothering with the case that <voice> is absent. But if that case someday occurs, I want to know precisely and immediately. Yet I don't want to write a detailed error message for every violated assumption, of which there are dozens necessary. So my solution is to find these things with case exhaustions. The program crashes and I have to inspect the code, but no problem.</div><div><br></div><div><br></div><div>D</div><div><br></div><div><br></div><div><br></div></div></div></div>