<div dir="ltr"><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif"><br></font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">Thanks Viktor, you've answered (in the negative) one of my follow-on q's which was: </font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">isn't the comma just standing for Boolean `&&` ?</font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif"><br></font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">> which would otherwise be something like: ...
<br></font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">I would go:</font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">
>    smtpGreeting :: Int -> SmtpReply -> SmtpM B.ByteString
>    smtpGreeting _ r =
>        | replyCont r            = pure B.empty</font><pre style="white-space:pre-wrap"><font face="arial, sans-serif">>        | code `div` 100 /= 2    = B.empty <$ modify' bail code
>        | otherwise              = smtpSendHello
>      where
</font><pre style="white-space:pre-wrap"><font face="arial, sans-serif">>        code = replyCode r</font></pre><pre style="white-space:pre-wrap"><font face="arial, sans-serif">>        bail code s =</font></pre><font face="arial, sans-serif">>            s { smtpErr = ProtoErr code $ replyText r }

</font></pre><font face="arial, sans-serif">> but I find the pattern guard form to read "declarative",</font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif"><br></font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">Hmm? Your `code <- ...` left-arrow doesn't look at all declarative to me. It's reminiscent of a binding in a do-block, or a 'source' in a comprehension. Strong imperative/sequential overtones.</font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif"><br></font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">> with less "if then else" baggage and nesting getting in the way of seeing the essential conditions.</font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif"><br></font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">My suggestion above also avoids "if then else".</font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">I guess a case of de gustibus ...</font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">To my taste, GHC Haskell is just too bloated/there's too many (equivalent) ways of writing code/there's too many idioms I have to keep up with to read code. It's not that there's anything particularly 'wrong' with any one of them; it's the sheer number of them. I'd have to say patterns/matching suffer a low power to weight ratio, where 'weight' means syntactic clutter and gotcha's: View pattern arrow-from-nowhere, I'm looking at you; pattern signatures double-forall's, empty forall's, double-constraints, I'm looking at you.</font></pre><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><br></pre></div>