<div dir="ltr"><font face="arial, sans-serif">Hi Michael, oh dear, oh dear, oh dear.</font><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">The seeds of your confusion are very evident from your message. How to back you out of whatever deep rabbit-hole you've managed to get your head into?<br></font><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">> <span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"> ... Your </span>average<span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"> reader (already a programmer) would be better served by a </span><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">comparative approach: Here's how to say something in a couple of other </span><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">programming languages, here's how to say something roughly equivalent </span><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">in Haskell -- BUT, here's how it's subtly different in Haskell.</span></font><br></div></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">No. Just no. Haskell is not "subtly different" to (say) Java in the way that C++ or C# are different. (I'll leave others to judge how subtly different they are.)</span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">Haskell is dramatically and fundamentally different. You can't just 'translate' an algorithm from OOP to Haskell. Many newbies try, and there's many tales of woe on StackOverflow. Just No.</span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">I really don't know how you could have got any experience with Haskell and say "subtly".</span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">I suggest you unlearn everything you think you know about Haskell, and strike out in an entirely different direction. The best approach would be to spend a few days playing with lambda calculus. (That's what I did before tackling Haskell.)</span></font></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif"><br></font></span></div><div><pre style="white-space:pre-wrap;color:rgb(0,0,0)"><font face="arial, sans-serif">> (I've actually been curtly informed on the beginners' list -- yes, the beginner' list! -- that my problems of comprehension can be solved simply: "Learn lambda calculus.")</font></pre></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif"><br></font></span></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif">Lambda calculus is an excellent place for beginners to start. What could be easier to learn? It's certainly easier than grokking a Turing machine; and much easier than Haskell: less than a handful of primitives yet can compute anything computable.</font></span></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif"><br></font></span></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">> </span><span style="color:rgb(0,0,0);font-size:1em;white-space:pre-wrap">And since the concepts are seldom described in </span><span style="color:rgb(0,0,0);font-size:1em;white-space:pre-wrap">concrete enough and time-honored programming language terms (by </span><span style="color:rgb(0,0,0);font-size:1em;white-space:pre-wrap">comparison to other programming languages) </span></font></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif"><br></font></span></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif">I'm guessing that the concepts you're talking of simply don't correspond to anything in time-honoured (procedural) programming. Anybody writing about Haskell (including anybody writing the User Guide) assumes a base level of understanding of Haskell. You've clearly veered off the track and haven't yet reached base. Remember the User Guide builds on top of the Language Report.</font></span></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif"><br></font></span></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif">(On the point of 'time-honoured': lambda calculus is almost exactly the same age as Turing machines. The first well-known programming language using lambda-calculus ideas (LISP 1966) is almost exactly the same age as the first OOP language (Simula 1967). Which is the more time-honoured?)</font></span></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif"><br></font></span></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif">You do have a point that the terminology in Haskell is often mysterious</font></span></div><div><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><font face="arial, sans-serif"><br></font></span></div><div><font face="arial, sans-serif"><font color="#000000"><span style="white-space:pre-wrap">> [SPJ said] </span></font><span style="color:rgb(0,0,0);font-size:1em;white-space:pre-wrap">F# had settled on the term "workflow" instead of "monad", </span><span style="color:rgb(0,0,0);font-size:1em;white-space:pre-wrap">and he felt this was wise.</span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">Yes many have yearned for a more warm-and-cuddly term than "monad". But the terminology barrier starts before that.</span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">Haskell typeclasses are not 'classes' in any sense recognisable from OOP. There are no objects, no hidden state, no destructive assignment. We might go back to February 1988 when a strawman for what became typeclasses used OVERLOAD/INSTANCE.</span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap">AntC</span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><br></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div><div><font face="arial, sans-serif"><span style="font-size:1em;color:rgb(0,0,0);white-space:pre-wrap"><br></span></font></div></div>