On 31/01/07, <b class="gmail_sendername">Michael T. Richter</b> &lt;<a href="mailto:ttmrichter@gmail.com">ttmrichter@gmail.com</a>&gt; wrote:<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">



  
  

<div><span class="q"></span>I disagree with this part.&nbsp; Books written by committee lack cohesion unless they have an overbearing editor at the helm.&nbsp; What I&#39;ve seen on the Wiki as regards idioms, standard practices, etc. -- and this is true of every language wiki I&#39;ve ever seen -- is one proposed answer and then a chain of &quot;but you could do it this way instead&quot; with ever-increasingly-obscure ways of doing things.&nbsp; Which would be the precise 
<b>opposite</b> of what a &quot;Haskell for the Working Programmer&quot; book should be like.</div></blockquote><div><br>I agree up to a point - there&#39;s a huge risk that increasingly &quot;advanced&quot; solutions will obscure the point. A reasonable amount of editorial control could keep this in check, though. 
<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div>
A book like this should be clear, straightforward and provide an <i>introduction</i> to Haskell for a working programmer, but an introduction that gets said programmer up and on the job quickly.&nbsp; After using the (possibly even less than ideal) solutions provided in the book, the reader can then comfortably hone the newfound skills provided.
<br>
<br>
I do like the idea of developing a table of contents first and backfilling it, though.&nbsp; I would amend the process, however, to avoid the WikiBloat that seems to inevitably follow when documentation projects get too open.&nbsp; Instead of Wikifying it, I&#39;d suggest instead that a &quot;call for proposals&quot; be put on the mailing list.&nbsp; &quot;I&#39;m working on a chapter dealing with database programming.&nbsp; I need to know how to do &lt;insert whatever&gt; in Haskell.&nbsp; Could anybody interested in helping please submit some commented, functioning code for possible inclusion?&quot;&nbsp; Then the submissions could be made by email (and possibly even discussed on-list) and the editor/author of the book can take an executive decision and choose one if there are competing camps.
<br>
</div></blockquote></div><br>Possibly. From my own point of view, though, I&#39;m usually only after fairly simple snippets of code - certainly not enough for a book chapter (although they could be grouped into chapters by topic).
<br><br>Here&#39;s a slightly extended example: a key snippet for me would be &quot;execute a query against a database and get the results&quot;. Naively, I see this as an IO action, much like reading a file. So I&#39;d expect something like
<br><br>&nbsp;&nbsp;&nbsp; connect :: String -&gt; String -&gt; String -&gt; IO dbHandle<br>&nbsp;&nbsp;&nbsp; connect user password db = {- some magic to connect and give me a DB handle -}<br><br>&nbsp;&nbsp;&nbsp; close :: dbHandle -&gt; IO ()<br>&nbsp;&nbsp;&nbsp; close dbh = {- magic to close the handle -}
<br><br>&nbsp;&nbsp;&nbsp; query :: dbHandle -&gt; String -&gt; IO [String]<br>&nbsp;&nbsp;&nbsp; query dbh sql = {- more magic to do the query and return results -}<br><br>I&#39;d use this as<br><br>&nbsp;&nbsp;&nbsp; do dbh &lt;- connect &quot;system&quot; &quot;manager&quot; &quot;my_oracle_db&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results &lt;- query dbh &quot;select * from all_users&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close dbh<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return results<br><br>(I&#39;d see it as being in the IO monad, so that I can intersperse other IO actions. Maybe that&#39;s not necessary, but that&#39;s a different recipe - how do I intersperse actions in 2 different monads - that I&#39;d class as quite advanced).
<br><br>It&#39;s not remotely functional, it&#39;s likely not to be &quot;the best way&quot; and it&#39;s probably making the advanced users squirm, but that&#39;s not the point. It fits my beginner&#39;s mental model - I&#39;m new to Haskell, I&#39;ve grasped the concept of IO and probably a little bit of how monads are great for structuring code (I&#39;d probably write my own &quot;auto-close&quot; control structure for this - and soon after, find that it already exists!) but I&#39;m not really worried. To me, Haskell is brilliant for slinging data around in clever ways. So this is just annoying boilerplate I need to get the data into my program - it doesn&#39;t even have to be efficient, because I&#39;m only grabbing a few tens of rows here (getting data lazily would be a *separate* recipe, that I&#39;d look at for the million-row query I&#39;ll try once I feel like getting more advanced).
<br><br>The point of this is that to me, pulling data out of databases is *boring*. The interesting bit is manipulating that data - and that&#39;s the bit that drew me to Haskell because other languages make the data manipulation tedious and boring as well. So I want easily tailorable snippets of code to get me past the boring stuff - I&#39;m busy learning interesting things elsewhere in Haskell at the moment.
<br><br>Of course, in the above you could easily substitute any number of tasks for &quot;querying a database&quot;. Grabbing web pages, displaying a GUI, etc. The point is the same - they aren&#39;t (yet) the interesting bit.
<br><br>Sorry, that went on a bit - I hope it was useful nevertheless.<br><br>Paul.<br>