The point of concepts like functors, monoids, and monads is not because they provide functionality that wouldn&#39;t normally be accessible, but for the following reasons:<br><br>1.&nbsp; The concept encapsulates a huge number of common programming idioms.&nbsp; Indicating that a concept fits the functor, monad, or monoid paradigm provides the advantages that<br>

<div style="margin-left: 40px;">a) significant repeated code can be scrapped in favor of general library code.&nbsp; Writing &quot;mconcat&quot; is much nicer than writing &quot;foldr (++) []&quot;, though perhaps lists aren&#39;t the best example (due to the presence of just plain &quot;concat&quot;).<i></i><br>

b) Using fully general, well-known (within the Haskell community) abstractions provides other programmers with easily read hints about the behavior of your code, such as the indication that a Foo can be composed with another Foo in an associative fashion, so parentheses are irrelevant.&nbsp; (So foldl mappend mzero ls is equivalent to foldr mappend mzero ls, but the latter fuses more powerfully without stream fusion.)<br>

</div>2. Very abstract, very general typeclasses in libraries come with very general combinators and functions in libraries, with the bonus that GHC&#39;s optimizer is almost always capable of optimizing code using these general structures into code just as, or very nearly as, good as equivalent code that would take you hours to write and would considerably obfuscate the programmer&#39;s actual intention.<br>

3. Writing code in a very general, abstract fashion can considerably improve the <i>developer</i>&#39;s
thinking about the program.&nbsp; As an example, this weekend I was playing
with (very, very custom-tuned) monads to fill up the contents of an
array in several different fashions, and taught myself monad
transformers as a very elegant way to encapsulate a shared, universal
array, a mutable index state, and successive (associative and
commutative) operations on a State; this went through several permutations (and is still in progress).<br><br>As an additional observation, using the Sum, Product, Any, and other similar monoids, when done appropriately and mconcat&#39;d, gives no actual overhead due to standard optimizations (in particular, each of them is a newtype).&nbsp; That&#39;s to say that I&#39;m almost positive that mconcat (map Product ls) is equivalent to foldMap <br>

<br><br clear="all">Louis Wasserman<br><a href="mailto:wasserman.louis@gmail.com" target="_blank">wasserman.louis@gmail.com</a><br>
<br><br><div class="gmail_quote">On Sat, Jan 17, 2009 at 10:46 AM,  <span dir="ltr">&lt;<a href="mailto:haskell-cafe-request@haskell.org" target="_blank">haskell-cafe-request@haskell.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Send Haskell-Cafe mailing list submissions to<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
or, via email, send a message with subject or body &#39;help&#39; to<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:haskell-cafe-request@haskell.org" target="_blank">haskell-cafe-request@haskell.org</a><br>
<br>
You can reach the person managing the list at<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:haskell-cafe-owner@haskell.org" target="_blank">haskell-cafe-owner@haskell.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than &quot;Re: Contents of Haskell-Cafe digest...&quot;<br>
<br>
<br>
Today&#39;s Topics:<br>
<br>
 &nbsp; 1. Re: Comments from OCaml Hacker Brian Hurt (david48)<br>
 &nbsp; 2. Re: Re: Comments from OCaml Hacker Brian Hurt (david48)<br>
 &nbsp; 3. Re: Comments from OCaml Hacker Brian Hurt (Andrew Coppin)<br>
 &nbsp; 4. Re: some ideas for Haskell&#39;, from Python (Artyom Shalkhakov)<br>
 &nbsp; 5. Re: Comments from OCaml Hacker Brian Hurt (Andrew Coppin)<br>
 &nbsp; 6. Re: Re: Comments from OCaml Hacker Brian Hurt (Eugene Kirpichov)<br>
 &nbsp; 7. Re: Comments from OCaml Hacker Brian Hurt (Eugene Kirpichov)<br>
 &nbsp; 8. Functors [Comments from OCaml Hacker Brian Hurt] (Andrew Coppin)<br>
 &nbsp; 9. Re: Functors [Comments from OCaml Hacker Brian Hurt]<br>
 &nbsp; &nbsp; &nbsp;(Eugene Kirpichov)<br>
 &nbsp;10. Re: Functors [Comments from OCaml Hacker Brian Hurt] (Luke Palmer)<br>
 &nbsp;11. Re[2]: [Haskell-cafe] Functors [Comments from OCaml Hacker<br>
 &nbsp; &nbsp; &nbsp;Brian Hurt] (Bulat Ziganshin)<br>
 &nbsp;12. Re: Re[2]: [Haskell-cafe] Comments from OCaml Hacker Brian<br>
 &nbsp; &nbsp; &nbsp;Hurt (David Leimbach)<br>
 &nbsp;13. OS X build failure of Gtk2Hs from MacPorts (Jeff Heard)<br>
 &nbsp;14. Re: Comments from OCaml Hacker Brian Hurt (Lennart Augustsson)<br>
 &nbsp;15. Re: Comments from OCaml Hacker Brian Hurt (David Leimbach)<br>
 &nbsp;16. Re: ANN: HTTPbis / HTTP-4000.x package available (Tim Newsham)<br>
 &nbsp;17. Efficient Factoring Out of Constants (Phil)<br>
 &nbsp;18. Re: Efficient Factoring Out of Constants (Luke Palmer)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Sat, 17 Jan 2009 10:47:56 +0100<br>
From: david48 &lt;<a href="mailto:dav.vire%2Bhaskell@gmail.com" target="_blank">dav.vire+haskell@gmail.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Comments from OCaml Hacker Brian Hurt<br>
To: &quot;Jonathan Cast&quot; &lt;<a href="mailto:jonathanccast@fastmail.fm" target="_blank">jonathanccast@fastmail.fm</a>&gt;<br>
Cc: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:4c88418c0901170147u3e0a3d65r2ab72d9bbc8cb1e6@mail.gmail.com" target="_blank">4c88418c0901170147u3e0a3d65r2ab72d9bbc8cb1e6@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=UTF-8<br>
<br>
On Fri, Jan 16, 2009 at 4:04 PM, Jonathan Cast<br>
&lt;<a href="mailto:jonathanccast@fastmail.fm" target="_blank">jonathanccast@fastmail.fm</a>&gt; wrote:<br>
<br>
&gt; On Fri, 2009-01-16 at 14:16 +0100, david48 wrote:<br>
&gt;&gt; Part of the problem is that something like a monoid is so general that<br>
&gt;&gt; I can&#39;t wrap my head around why going so far in the abstraction.<br>
&gt;&gt; For example, the writer monad works with a monoid; using the writer<br>
&gt;&gt; monad with strings makes sense because the mappend operation for lists<br>
&gt;&gt; is (++), now why should I care that I can use the writer monad with<br>
&gt;&gt; numbers<br>
&gt;&gt; which it will sum ?<br>
&gt;<br>
&gt; To accumulate a running count, maybe? &nbsp;A fairly common pattern for<br>
&gt; counting in imperative languages is<br>
&gt;<br>
&gt; int i = 0;<br>
&gt; while (&lt;get a value&gt;) i+= &lt;count of something in value&gt;<br>
&gt;<br>
&gt; Using the writer monad, this turns into<br>
&gt;<br>
&gt; execWriter $ mapM_ (write . countFunction) $ getValues<br>
<br>
well thank you for the example, if I may ask something: why would I<br>
need to write a running count this way instead of, for example, a non<br>
monadic fold, which would probably result in clearer and faster code<br>
(IMHO) ?<br>
<br>
<br>
------------------------------<br>
<br>
Message: 2<br>
Date: Sat, 17 Jan 2009 11:08:25 +0100<br>
From: david48 &lt;<a href="mailto:dav.vire%2Bhaskell@gmail.com" target="_blank">dav.vire+haskell@gmail.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Re: Comments from OCaml Hacker Brian Hurt<br>
To: &quot;Apfelmus, Heinrich&quot; &lt;<a href="mailto:apfelmus@quantentunnel.de" target="_blank">apfelmus@quantentunnel.de</a>&gt;<br>
Cc: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:4c88418c0901170208i74358328ycaa10359fb639873@mail.gmail.com" target="_blank">4c88418c0901170208i74358328ycaa10359fb639873@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=UTF-8<br>
<br>
On Fri, Jan 16, 2009 at 10:28 PM, Apfelmus, Heinrich<br>
&lt;<a href="mailto:apfelmus@quantentunnel.de" target="_blank">apfelmus@quantentunnel.de</a>&gt; wrote:<br>
<br>
&gt; david48 wrote:<br>
<br>
&gt;&gt; I don&#39;t care about the name, it&#39;s ok for me that the name<br>
&gt;&gt; mathematicians defined is used, but there are about two categories of<br>
&gt;&gt; people using haskell and<br>
&gt;&gt; I would love that each concept would be adequately documented for everyone:<br>
&gt;&gt; - real-world oriented programming documentation with usefulness and<br>
&gt;&gt; examples for the non mathematician<br>
&gt;&gt; - the mathematics concepts and research papers for the mathematicians<br>
&gt;&gt; for those who want/need to go further<br>
<br>
&gt;&gt; As someone mentionned, the documentation can&#39;t really be done by<br>
&gt;&gt; someone that doesn&#39;t fully grok the concepts involved.<br>
<br>
&gt; Good account of the current documentation situation.<br>
<br>
&gt; Hm, what about the option of opening Bird&#39;s &quot;Introduction on Functional<br>
&gt; Programming using Haskell&quot; in the section about fold? Monoid is on page<br>
&gt; 62 in the translated copy I&#39;ve got here.<br>
<br>
I don&#39;t have this book. I have real world haskell and purely<br>
functional data structures though.<br>
<br>
&gt; Does Hutton&#39;s book mention them? Real World Haskell?<br>
<br>
the first time it is mentionned in RWH according to the index is page<br>
266 where we read<br>
&quot;We forgot to test the Monoid instance&quot;<br>
...<br>
&quot;...of Monoid, which is the class of types that support appending and<br>
empty elements:&quot;<br>
<br>
Appending.... :)<br>
<br>
On the other hand, on page 320 there is a nice explanation of Monoid,<br>
and on page 380, which isn&#39;t mentionned in the index, there might be<br>
the first time one can understand why the writer monad works with<br>
monoids instead of lists: to be able to use better suited data types<br>
for appending.<br>
<br>
All of this is still lacking the great why : why/how an abstraction so<br>
generic can be useful.<br>
I&#39;m starting to believe that the only reason to make a datatype an<br>
instance of Monoid is... why not ! since it&#39;s not hard to find an<br>
associative operation and a neutral element.<br>
<br>
&gt; I don&#39;t think that I would try to learn a programming language, for<br>
&gt; example Python, without obtaining a paper book on it.<br>
<br>
I would, if the online documentation makes it possible, and then I<br>
would buy a paper book later, to go further or for reference.<br>
That&#39;s how I learned Haskell, and much later I&#39;ve bought my first book.<br>
<br>
<br>
------------------------------<br>
<br>
Message: 3<br>
Date: Sat, 17 Jan 2009 11:07:03 +0000<br>
From: Andrew Coppin &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Comments from OCaml Hacker Brian Hurt<br>
To: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID: &lt;<a href="mailto:4971BBD7.504@btinternet.com" target="_blank">4971BBD7.504@btinternet.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed<br>
<br>
Anton van Straaten wrote:<br>
&gt; Niklas Broberg wrote:<br>
&gt;&gt;&gt; I still think existential quantification is a step too far though. :-P<br>
&gt;&gt;<br>
&gt;&gt; Seriously, existential quantification is a REALLY simple concept, that<br>
&gt;&gt; you would learn week two (or maybe three) in any introductory course<br>
&gt;&gt; on logic. In fact, I would argue that far more people probably know<br>
&gt;&gt; what existential quantification is than that know what a monoid is.<br>
&gt;&gt; :-)<br>
&gt;<br>
&gt; Andrew&#39;s core objection here seems reasonable to me. &nbsp;It was this:<br>
&gt;<br>
&gt; &gt; {-# LANGUAGE ExistentialQuantification #-} is an absurd name and<br>
&gt; &gt; should be changed to something that, at a minimum, tells you it&#39;s<br>
&gt; &gt; something to do with the type system.<br>
&gt;<br>
&gt; But I suspect I part company from Andrew in thinking that something<br>
&gt; like ExistentiallyQuantifiedTypes would be a perfectly fine alternative.<br>
<br>
I would suggest that ExistentiallyQuantifiedTypeVariables would be an<br>
improvement on just ExistentialQuantification - but I&#39;d still prefer the<br>
less cryptic HiddenTypeVariables. (Since, after all, that&#39;s all this<br>
actually does.)<br>
<br>
Either way, nobody is going to change the name, so why worry?<br>
<br>
<br>
<br>
PS. There exist courses on logic? That could be potentially interesting...<br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 4<br>
Date: Sat, 17 Jan 2009 17:12:14 +0600<br>
From: Artyom Shalkhakov &lt;<a href="mailto:artyom.shalkhakov@gmail.com" target="_blank">artyom.shalkhakov@gmail.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] some ideas for Haskell&#39;, from Python<br>
To: Immanuel Litzroth &lt;<a href="mailto:immanuel203@gmail.com" target="_blank">immanuel203@gmail.com</a>&gt;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:2076f2f90901170312y7e6dfa36jf61ab2f67f1c454a@mail.gmail.com" target="_blank">2076f2f90901170312y7e6dfa36jf61ab2f67f1c454a@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=UTF-8<br>
<br>
Hello,<br>
<br>
2009/1/16 Immanuel Litzroth &lt;<a href="mailto:immanuel203@gmail.com" target="_blank">immanuel203@gmail.com</a>&gt;:<br>
&gt; I don&#39;t understand your comment.<br>
&gt; 1) If XMonad already uses it the problem is solved, without giving Haskell<br>
&gt; import new semantics?<br>
<br>
Right, but there are some restrictions.<br>
<br>
&gt; 2) These guys refer to a method to do plugin work in Haskell<br>
&gt; <a href="http://www.cse.unsw.edu.au/%7Edons/hs-plugins/" target="_blank">http://www.cse.unsw.edu.au/~dons/hs-plugins/</a><br>
&gt; So the problem of dynamically loading plugins should already be solved?<br>
<br>
Well, mostly yes, but I think that it should be added to the language.<br>
<br>
Cheers,<br>
Artyom Shalkhakov.<br>
<br>
<br>
------------------------------<br>
<br>
Message: 5<br>
Date: Sat, 17 Jan 2009 11:17:12 +0000<br>
From: Andrew Coppin &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Comments from OCaml Hacker Brian Hurt<br>
To: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID: &lt;<a href="mailto:4971BE38.9060002@btinternet.com" target="_blank">4971BE38.9060002@btinternet.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed<br>
<br>
Cory Knapp wrote:<br>
&gt; Actually, that was part of my point: When I mention Haskell to people,<br>
&gt; and when I start describing it, they&#39;re generally frightened enough by<br>
&gt; the focus on pure code and lazy evaluation-- add to this the<br>
&gt; inherently abstract nature, and we can name typeclasses<br>
&gt; &quot;cuddlyKitten&quot;, and the language is still going to scare J. R.<br>
&gt; Programmer. By &quot;inherently mathematical nature&quot;, I didn&#39;t mean names<br>
&gt; like &quot;monoid&quot; and &quot;functor&quot;, I meant *concepts* like monoid and<br>
&gt; functor. Not that either of them are actually terribly difficult; the<br>
&gt; problem is that they are terribly abstract. That draws a lot of people<br>
&gt; (especially mathematicians), but most people who aren&#39; drawn by that<br>
&gt; are hugely put off-- whatever the name is. So, I guess my point is<br>
&gt; that the name is irrelevant: the language is going to intimidate a lot<br>
&gt; of people who are intimidated by the vocabulary.<br>
<br>
Oh, I don&#39;t know. I have no idea what the mathematical definition of<br>
&quot;functor&quot; is, but as far as I can tell, the Haskell typeclass merely<br>
allows you to apply a function simultaneously to all elements of a<br>
collection. That&#39;s pretty concrete - and trivial. If it weren&#39;t for the<br>
seemingly cryptic name, nobody would think twice about it. (Not sure<br>
exactly what you&#39;d call it though...)<br>
<br>
A monoid is a rather more vague concept. (And I&#39;m still not really sure<br>
why it&#39;s useful on its own. Maybe I just haven&#39;t had need of it yet?)<br>
<br>
I think, as somebody suggested about &quot;monad&quot;, the name does tend to<br>
inspire a feeling of &quot;hey, this must be really complicated&quot; so that even<br>
after you&#39;ve understood it, you end up wondering whether there&#39;s still<br>
something more to it than that.<br>
<br>
But yes, some people are definitely put off by the whole &quot;abstraction of<br>
abstractions of abstraction&quot; thing. I think we probably just need some<br>
more concrete examples to weight it down and make it seem like something<br>
applicable to the real world.<br>
<br>
(Thus far, I have convinced exactly *one* person to start learning<br>
Haskell. This person being something of a maths nerd, their main<br>
complaint was not about naming or abstraction, but about the<br>
&quot;implicitness&quot; of the language, and the extreme difficulty of visually<br>
parsing it. Perhaps not surprising comming from a professional C++<br>
programmer...)<br>
<br>
&gt; At the same time, I think everyone is arguing *for* better<br>
&gt; documentation. And you&#39;re probably right: better documentation will<br>
&gt; bring the abstract nonsense down to earth somewhat.<br>
<br>
Amen!<br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 6<br>
Date: Sat, 17 Jan 2009 14:27:02 +0300<br>
From: &quot;Eugene Kirpichov&quot; &lt;<a href="mailto:ekirpichov@gmail.com" target="_blank">ekirpichov@gmail.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Re: Comments from OCaml Hacker Brian Hurt<br>
To: david48 &lt;<a href="mailto:dav.vire%2Bhaskell@gmail.com" target="_blank">dav.vire+haskell@gmail.com</a>&gt;<br>
Cc: &quot;Apfelmus, Heinrich&quot; &lt;<a href="mailto:apfelmus@quantentunnel.de" target="_blank">apfelmus@quantentunnel.de</a>&gt;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:5e0214850901170327t13bd62ds75167a28f68ed39c@mail.gmail.com" target="_blank">5e0214850901170327t13bd62ds75167a28f68ed39c@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
The great &quot;that&#39;s why&quot; is as follows: when you have an abstraction,<br>
then it is sufficient to hold the abstraction in mind instead of the<br>
whole concrete implementation. That&#39;s the whole purpose of<br>
abstraction, after all, be it maths or programming.<br>
<br>
Let me illustrate this.<br>
<br>
Suppose you are developing a library that, for instance, has a notion<br>
of &quot;settings&quot; and is able to combine two &quot;settings&quot; with several<br>
strategies for resolving conflicts between settings with duplicate<br>
keys: take the first setting, the second, none, or make a setting with<br>
multiple values. For example, an alternative GetOpt.<br>
<br>
Suppose you don&#39;t know what a monoid is and don&#39;t even know that such<br>
an abstraction exists.<br>
Now, when you&#39;re reasoning about the library, you have to think &quot;If I<br>
combine 3 settings, should the order of combination matter? Hmm, would<br>
be nice if it didn&#39;t. Also, what should I return if someone queries<br>
for a non-existent key in the settings? Should I return an empty list,<br>
or a Nothing, or throw an error, or what? Do empty settings make<br>
sense?&quot; etc. If you&#39;re smart and lucky, you will most probably get<br>
most things right and inconsciously create a settings monoid.<br>
<br>
Now, if you know what a monoid is, you immediately recognize that your<br>
settings should be a monoid by nature, and now you have absolutely no<br>
doubt that you should make the combining operation associative and<br>
provide a unit; and you use this monoid abstraction all the time you<br>
are designing this library. Now, you don&#39;t think about whether you<br>
should throw an error or return a Nothing for an empty key; but<br>
instead you think about which result would behave like a unit for the<br>
monoid, being motivated by mathematical principles rather than pure<br>
intuition.<br>
<br>
You end up designing a mathematically sound library whose principles<br>
make sence and has no design flaws, at least in the mathematically<br>
sound part, even if you never actually use the word &quot;monoid&quot; in the<br>
documentation.<br>
<br>
Also, read this post by sigfpe that motivated me to learn abstract<br>
algebra in depth (I am yet in the beginning, however), and, overall,<br>
this is a breathtaking post:<br>
<a href="http://sigfpe.blogspot.com/2008/11/approach-to-algorithm-parallelisation.html" target="_blank">http://sigfpe.blogspot.com/2008/11/approach-to-algorithm-parallelisation.html</a><br>
- this is where I started to appreciate the power of mathematical<br>
abstractions even more.<br>
<br>
2009/1/17 david48 &lt;<a href="mailto:dav.vire%2Bhaskell@gmail.com" target="_blank">dav.vire+haskell@gmail.com</a>&gt;:<br>
&gt; All of this is still lacking the great why : why/how an abstraction so<br>
&gt; generic can be useful.<br>
&gt; I&#39;m starting to believe that the only reason to make a datatype an<br>
&gt; instance of Monoid is... why not ! since it&#39;s not hard to find an<br>
&gt; associative operation and a neutral element.<br>
&gt;<br>
<br>
--<br>
Eugene Kirpichov<br>
<br>
<br>
------------------------------<br>
<br>
Message: 7<br>
Date: Sat, 17 Jan 2009 14:34:25 +0300<br>
From: &quot;Eugene Kirpichov&quot; &lt;<a href="mailto:ekirpichov@gmail.com" target="_blank">ekirpichov@gmail.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Comments from OCaml Hacker Brian Hurt<br>
To: &quot;Andrew Coppin&quot; &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;<br>
Cc: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:5e0214850901170334u27f17902nc56d0002f4702f06@mail.gmail.com" target="_blank">5e0214850901170334u27f17902nc56d0002f4702f06@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
2009/1/17 Andrew Coppin &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;:<br>
&gt; Cory Knapp wrote:<br>
&gt;&gt;<br>
&gt;&gt; Actually, that was part of my point: When I mention Haskell to people, and<br>
&gt;&gt; when I start describing it, they&#39;re generally frightened enough by the focus<br>
&gt;&gt; on pure code and lazy evaluation-- add to this the inherently abstract<br>
&gt;&gt; nature, and we can name typeclasses &quot;cuddlyKitten&quot;, and the language is<br>
&gt;&gt; still going to scare J. R. Programmer. By &quot;inherently mathematical nature&quot;,<br>
&gt;&gt; I didn&#39;t mean names like &quot;monoid&quot; and &quot;functor&quot;, I meant *concepts* like<br>
&gt;&gt; monoid and functor. Not that either of them are actually terribly difficult;<br>
&gt;&gt; the problem is that they are terribly abstract. That draws a lot of people<br>
&gt;&gt; (especially mathematicians), but most people who aren&#39; drawn by that are<br>
&gt;&gt; hugely put off-- whatever the name is. So, I guess my point is that the name<br>
&gt;&gt; is irrelevant: the language is going to intimidate a lot of people who are<br>
&gt;&gt; intimidated by the vocabulary.<br>
&gt;<br>
&gt; Oh, I don&#39;t know. I have no idea what the mathematical definition of<br>
&gt; &quot;functor&quot; is, but as far as I can tell, the Haskell typeclass merely allows<br>
&gt; you to apply a function simultaneously to all elements of a collection.<br>
&gt; That&#39;s pretty concrete - and trivial. If it weren&#39;t for the seemingly<br>
&gt; cryptic name, nobody would think twice about it. (Not sure exactly what<br>
&gt; you&#39;d call it though...)<br>
&gt;<br>
<br>
No, a functor is a more wide notion than that, it has nothing to do<br>
with collections.<br>
An explanation more close to truth would be &quot;A structure is a functor<br>
if it provides a way to convert a structure over X to a structure over<br>
Y, given a function X -&gt; Y, while preserving the underlying<br>
&#39;structure&#39;&quot;, where preserving structure means being compatible with<br>
composition and identity.<br>
<br>
Collections are one particular case.<br>
<br>
Another case is just functions with fixed domain A: given a<br>
&quot;structure&quot; of type [A-&gt;]X and a function of type X -&gt; Y, you may<br>
build an [A-&gt;]Y.<br>
<br>
Yet another case are monads (actually, the example above is the Reader<br>
monad): given a monadic computation of type &#39;m a&#39; and a function a -&gt;<br>
b, you may get a computation of type m b:<br>
<br>
instance (Monad m) =&gt; Functor m where<br>
 &nbsp;fmap f ma = do a &lt;- ma; return (f a)<br>
<br>
There are extremely many other examples of functors; they are as<br>
ubiquitous as monoids and monads :)<br>
<br>
--<br>
Eugene Kirpichov<br>
<br>
<br>
------------------------------<br>
<br>
Message: 8<br>
Date: Sat, 17 Jan 2009 12:04:01 +0000<br>
From: Andrew Coppin &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;<br>
Subject: [Haskell-cafe] Functors [Comments from OCaml Hacker Brian<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Hurt]<br>
To: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID: &lt;<a href="mailto:4971C931.2070202@btinternet.com" target="_blank">4971C931.2070202@btinternet.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed<br>
<br>
Eugene Kirpichov wrote:<br>
&gt; No, a functor is a more wide notion than that, it has nothing to do<br>
&gt; with collections.<br>
&gt; An explanation more close to truth would be &quot;A structure is a functor<br>
&gt; if it provides a way to convert a structure over X to a structure over<br>
&gt; Y, given a function X -&gt; Y, while preserving the underlying<br>
&gt; &#39;structure&#39;&quot;, where preserving structure means being compatible with<br>
&gt; composition and identity.<br>
&gt;<br>
<br>
As far as I&#39;m aware, constraints like &quot;while preserving the underlying<br>
structure&quot; are not expressible in Haskell.<br>
<br>
&gt; instance (Monad m) =&gt; Functor m where<br>
&gt; &nbsp; fmap f ma = do a &lt;- ma; return (f a)<br>
&gt;<br>
<br>
While that&#39;s quite interesting from a mathematical point of view, how is<br>
this &quot;useful&quot; for programming purposes?<br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 9<br>
Date: Sat, 17 Jan 2009 15:12:26 +0300<br>
From: &quot;Eugene Kirpichov&quot; &lt;<a href="mailto:ekirpichov@gmail.com" target="_blank">ekirpichov@gmail.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Functors [Comments from OCaml Hacker Brian<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Hurt]<br>
To: &quot;Andrew Coppin&quot; &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;<br>
Cc: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:5e0214850901170412j12536846r91f7dc58d8b8f806@mail.gmail.com" target="_blank">5e0214850901170412j12536846r91f7dc58d8b8f806@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
2009/1/17 Andrew Coppin &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;:<br>
&gt; Eugene Kirpichov wrote:<br>
&gt;&gt;<br>
&gt;&gt; No, a functor is a more wide notion than that, it has nothing to do<br>
&gt;&gt; with collections.<br>
&gt;&gt; An explanation more close to truth would be &quot;A structure is a functor<br>
&gt;&gt; if it provides a way to convert a structure over X to a structure over<br>
&gt;&gt; Y, given a function X -&gt; Y, while preserving the underlying<br>
&gt;&gt; &#39;structure&#39;&quot;, where preserving structure means being compatible with<br>
&gt;&gt; composition and identity.<br>
&gt;&gt;<br>
&gt;<br>
&gt; As far as I&#39;m aware, constraints like &quot;while preserving the underlying<br>
&gt; structure&quot; are not expressible in Haskell.<br>
<br>
Yes, but they are expressible in your mind so that you can recognize a<br>
functor and design you program so that it does satisfy this<br>
constraint, thus removing a large faulty piece of the design space.<br>
<br>
Also, you can write a QuickCheck test for fmap (f . g) = fmap f . fmap<br>
g and fmap id = id.<br>
<br>
&gt;<br>
&gt;&gt; instance (Monad m) =&gt; Functor m where<br>
&gt;&gt; &nbsp;fmap f ma = do a &lt;- ma; return (f a)<br>
&gt;&gt;<br>
&gt;<br>
&gt; While that&#39;s quite interesting from a mathematical point of view, how is<br>
&gt; this &quot;useful&quot; for programming purposes?<br>
<br>
In the same sense as monoids are, see my previous message.<br>
<br>
If you mean the usefulness of a Functor typeclass in Haskell, it&#39;s in<br>
the fact that everywhere where you&#39;d like to convert a structure over<br>
X to a structure over Y (for example, the result of a monadic<br>
computation), you simply write &#39;fmap f structure&#39; and it works the<br>
right way, if the structure has an instance for Functor (many<br>
structures do). I know I&#39;m being a bit abstract, but that&#39;s the way I<br>
percept it.<br>
<br>
do filename &lt;- toLowerCase `fmap` readLine<br>
 &nbsp; &nbsp;....<br>
<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
<br>
<br>
------------------------------<br>
<br>
Message: 10<br>
Date: Sat, 17 Jan 2009 05:16:06 -0700<br>
From: Luke Palmer &lt;<a href="mailto:lrpalmer@gmail.com" target="_blank">lrpalmer@gmail.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Functors [Comments from OCaml Hacker Brian<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Hurt]<br>
To: Andrew Coppin &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;<br>
Cc: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:7ca3f0160901170416n28e822c1t5cd693d61f9446a3@mail.gmail.com" target="_blank">7ca3f0160901170416n28e822c1t5cd693d61f9446a3@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;iso-8859-1&quot;<br>
<br>
On Sat, Jan 17, 2009 at 5:04 AM, Andrew Coppin<br>
&lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;wrote:<br>
<br>
&gt; Eugene Kirpichov wrote:<br>
&gt;<br>
&gt;&gt; No, a functor is a more wide notion than that, it has nothing to do<br>
&gt;&gt; with collections.<br>
&gt;&gt; An explanation more close to truth would be &quot;A structure is a functor<br>
&gt;&gt; if it provides a way to convert a structure over X to a structure over<br>
&gt;&gt; Y, given a function X -&gt; Y, while preserving the underlying<br>
&gt;&gt; &#39;structure&#39;&quot;, where preserving structure means being compatible with<br>
&gt;&gt; composition and identity.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
&gt; As far as I&#39;m aware, constraints like &quot;while preserving the underlying<br>
&gt; structure&quot; are not expressible in Haskell.<br>
<br>
<br>
Well, they&#39;re expressible *about* Haskell. &nbsp;I.e., for functors we require:<br>
<br>
 &nbsp;fmap id = id<br>
 &nbsp;fmap (f . g) = fmap f . fmap g<br>
<br>
&nbsp;The first property is how we write &quot;preserving underlying structure&quot;, but<br>
this has a precise, well-defined meaning that we can say a given functor<br>
obeys or it does not (and if it does not, we say that it&#39;s a bad instance).<br>
But you are correct that Haskell does not allow us to require proofs of such<br>
properties.<br>
<br>
And indeed, some people break those properties in various ways, which some<br>
consider okay if the breakage is not observable from outside a given<br>
abstraction barrier. &nbsp;I&#39;m on the fence about that...<br>
<br>
Luke<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <a href="http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/b07c6f56/attachment-0001.htm" target="_blank">http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/b07c6f56/attachment-0001.htm</a><br>


<br>
------------------------------<br>
<br>
Message: 11<br>
Date: Sat, 17 Jan 2009 16:28:05 +0300<br>
From: Bulat Ziganshin &lt;<a href="mailto:bulat.ziganshin@gmail.com" target="_blank">bulat.ziganshin@gmail.com</a>&gt;<br>
Subject: Re[2]: [Haskell-cafe] Functors [Comments from OCaml Hacker<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Brian Hurt]<br>
To: Luke Palmer &lt;<a href="mailto:lrpalmer@gmail.com" target="_blank">lrpalmer@gmail.com</a>&gt;<br>
Cc: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID: &lt;<a href="mailto:1434901537.20090117162805@gmail.com" target="_blank">1434901537.20090117162805@gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=iso-8859-1<br>
<br>
Hello Luke,<br>
<br>
Saturday, January 17, 2009, 3:16:06 PM, you wrote:<br>
<br>
&gt; &nbsp; fmap id = id<br>
&gt; &nbsp; fmap (f . g) = fmap f . fmap g<br>
<br>
&gt; &nbsp;The first property is how we write &quot;preserving underlying<br>
&gt; structure&quot;, but this has a precise, well-defined meaning that we can<br>
&gt; say a given functor obeys or it does not (and if it does not, we say<br>
&gt; that it&#39;s a bad instance).&nbsp; But you are correct that Haskell does<br>
&gt; not allow us to require proofs of such properties.<br>
<br>
not haskell itself, but QuickCheck allows. we may even consider<br>
lifting these properties to the language level<br>
<br>
--<br>
Best regards,<br>
&nbsp;Bulat &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mailto:<a href="mailto:Bulat.Ziganshin@gmail.com" target="_blank">Bulat.Ziganshin@gmail.com</a><br>
<br>
<br>
<br>
------------------------------<br>
<br>
Message: 12<br>
Date: Sat, 17 Jan 2009 07:08:33 -0800<br>
From: David Leimbach &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt;<br>
Subject: Re: Re[2]: [Haskell-cafe] Comments from OCaml Hacker Brian<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Hurt<br>
To: david48 &lt;<a href="mailto:dav.vire%2Bhaskell@gmail.com" target="_blank">dav.vire+haskell@gmail.com</a>&gt;<br>
Cc: Bulat Ziganshin &lt;<a href="mailto:Bulat.Ziganshin@gmail.com" target="_blank">Bulat.Ziganshin@gmail.com</a>&gt;,<br>
 &nbsp; &nbsp; &nbsp; &nbsp;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:3e1162e60901170708q18621c2ehb062e33fc9bdd4a3@mail.gmail.com" target="_blank">3e1162e60901170708q18621c2ehb062e33fc9bdd4a3@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;iso-8859-1&quot;<br>
<br>
On Sat, Jan 17, 2009 at 1:41 AM, david48<br>
&lt;<a href="mailto:dav.vire%2Bhaskell@gmail.com" target="_blank">dav.vire+haskell@gmail.com</a>&lt;<a href="mailto:dav.vire%252Bhaskell@gmail.com" target="_blank">dav.vire%2Bhaskell@gmail.com</a>&gt;<br>
&gt; wrote:<br>
<br>
&gt; On Fri, Jan 16, 2009 at 3:10 PM, Bulat Ziganshin<br>
&gt; &lt;<a href="mailto:bulat.ziganshin@gmail.com" target="_blank">bulat.ziganshin@gmail.com</a>&gt; wrote:<br>
&gt; &gt; Hello david48,<br>
&gt; &gt;<br>
&gt; &gt; Friday, January 16, 2009, 4:16:51 PM, you wrote:<br>
&gt; &gt;<br>
&gt; &gt;&gt; Upon reading this thread, I asked myself : what&#39;s a monoid ? I had no<br>
&gt; &gt;&gt; idea. I read some posts, then google &quot;haskell monoid&quot;.<br>
&gt; &gt;<br>
&gt; &gt; it would be interesting to google &quot;C++ class&quot; or &quot;Lisp function&quot; and<br>
&gt; &gt; compare experience :)<br>
&gt;<br>
&gt; The first link for C++ class I find on google is the wikipedia article<br>
&gt; which I find understandable, has examples and explanations that relate<br>
&gt; to programming.<br>
&gt; OTOH, the wikipedia article for monoid is less easy (for me), though<br>
&gt; now I can follow the first paragraphs. But I don&#39;t find on the page<br>
&gt; how/why/where it relates to programming.<br>
<br>
<br>
So you&#39;re saying it should be better documented in Haskell what a Monoid is.<br>
&nbsp;Did you say you searched for &quot;C++ class&quot; why not &quot;Haskell Monoid&quot; then?<br>
&nbsp;The first correct google hit that didn&#39;t think I meant Monads, takes you<br>
straight to the GHC documentation for Data.Monoid.<br>
<br>
<br>
<br>
<br>
<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <a href="http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/44862fd0/attachment-0001.htm" target="_blank">http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/44862fd0/attachment-0001.htm</a><br>


<br>
------------------------------<br>
<br>
Message: 13<br>
Date: Sat, 17 Jan 2009 10:18:10 -0500<br>
From: &quot;Jeff Heard&quot; &lt;<a href="mailto:jefferson.r.heard@gmail.com" target="_blank">jefferson.r.heard@gmail.com</a>&gt;<br>
Subject: [Haskell-cafe] OS X build failure of Gtk2Hs from MacPorts<br>
To: <a href="mailto:gtk2hs-users@lists.sourceforge.net" target="_blank">gtk2hs-users@lists.sourceforge.net</a>, &quot;Haskell Cafe&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>&gt;<br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:4165d3a70901170718y74cd86d6oafcd0bf95018431f@mail.gmail.com" target="_blank">4165d3a70901170718y74cd86d6oafcd0bf95018431f@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
/opt/local/bin/ghc +RTS -RTS -c tools/hierarchyGen/TypeGen.hs -o<br>
tools/hierarchyGen/TypeGen.o -O -itools/hierarchyGen -package-conf<br>
package.conf.inplace -hide-all-packages -package base<br>
package.conf.inplace: openBinaryFile: does not exist (No such file or directory)<br>
/opt/local/bin/ghc +RTS -RTS -c tools/callbackGen/HookGenerator.hs -o<br>
tools/callbackGen/HookGenerator.o -O -I. -itools/callbackGen<br>
-package-conf package.conf.inplace -hide-all-packages -package base<br>
package.conf.inplace: openBinaryFile: does not exist (No such file or directory)<br>
rm -rf glib/System/Glib.o glib/System/Glib_split/; mkdir -p<br>
glib/System/Glib_split<br>
/opt/local/bin/ghc +RTS -RTS -split-objs -c glib/System/Glib.hs -o<br>
glib/System/Glib.o -O -fffi -iglib -package-conf package.conf.inplace<br>
-hide-all-packages -ignore-package glib -package base -package-name<br>
glib-0.9.13 &#39;-#include&lt;glib-object.h&gt;&#39; -I/opt/local/include/glib-2.0<br>
-I/opt/local/lib/glib-2.0/include -I/opt/local/include<br>
<br>
on the commandline:<br>
 &nbsp; &nbsp;Warning: -fffi is deprecated: use -XForeignFunctionInterface or<br>
pragma {-# LANGUAGE ForeignFunctionInterface#-} instead<br>
package.conf.inplace: openBinaryFile: does not exist (No such file or directory)<br>
make[1]: *** [glib/System/Glib.o] Error 1<br>
make: *** [all] Error 2<br>
<br>
<br>
------------------------------<br>
<br>
Message: 14<br>
Date: Sat, 17 Jan 2009 15:33:07 +0000<br>
From: &quot;Lennart Augustsson&quot; &lt;<a href="mailto:lennart@augustsson.net" target="_blank">lennart@augustsson.net</a>&gt;<br>
Subject: Re: [Haskell-cafe] Comments from OCaml Hacker Brian Hurt<br>
To: &quot;Andrew Coppin&quot; &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt;<br>
Cc: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:f4876cd70901170733o20a36b8bt4c2288c856d161e7@mail.gmail.com" target="_blank">f4876cd70901170733o20a36b8bt4c2288c856d161e7@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=ISO-8859-1<br>
<br>
Thinking that Functor allows you to apply a function to all elements<br>
in a collection is a good intuitive understanding. &nbsp;But fmap also<br>
allows applying a function on &quot;elements&quot; of things that can&#39;t really<br>
be called collections, e.g., the continuation monad.<br>
<br>
 &nbsp;-- Lennart<br>
<br>
On Sat, Jan 17, 2009 at 11:17 AM, Andrew Coppin<br>
&lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt; wrote:<br>
&gt; Cory Knapp wrote:<br>
&gt;&gt;<br>
&gt;&gt; Actually, that was part of my point: When I mention Haskell to people, and<br>
&gt;&gt; when I start describing it, they&#39;re generally frightened enough by the focus<br>
&gt;&gt; on pure code and lazy evaluation-- add to this the inherently abstract<br>
&gt;&gt; nature, and we can name typeclasses &quot;cuddlyKitten&quot;, and the language is<br>
&gt;&gt; still going to scare J. R. Programmer. By &quot;inherently mathematical nature&quot;,<br>
&gt;&gt; I didn&#39;t mean names like &quot;monoid&quot; and &quot;functor&quot;, I meant *concepts* like<br>
&gt;&gt; monoid and functor. Not that either of them are actually terribly difficult;<br>
&gt;&gt; the problem is that they are terribly abstract. That draws a lot of people<br>
&gt;&gt; (especially mathematicians), but most people who aren&#39; drawn by that are<br>
&gt;&gt; hugely put off-- whatever the name is. So, I guess my point is that the name<br>
&gt;&gt; is irrelevant: the language is going to intimidate a lot of people who are<br>
&gt;&gt; intimidated by the vocabulary.<br>
&gt;<br>
&gt; Oh, I don&#39;t know. I have no idea what the mathematical definition of<br>
&gt; &quot;functor&quot; is, but as far as I can tell, the Haskell typeclass merely allows<br>
&gt; you to apply a function simultaneously to all elements of a collection.<br>
&gt; That&#39;s pretty concrete - and trivial. If it weren&#39;t for the seemingly<br>
&gt; cryptic name, nobody would think twice about it. (Not sure exactly what<br>
&gt; you&#39;d call it though...)<br>
&gt;<br>
&gt; A monoid is a rather more vague concept. (And I&#39;m still not really sure why<br>
&gt; it&#39;s useful on its own. Maybe I just haven&#39;t had need of it yet?)<br>
&gt;<br>
&gt; I think, as somebody suggested about &quot;monad&quot;, the name does tend to inspire<br>
&gt; a feeling of &quot;hey, this must be really complicated&quot; so that even after<br>
&gt; you&#39;ve understood it, you end up wondering whether there&#39;s still something<br>
&gt; more to it than that.<br>
&gt;<br>
&gt; But yes, some people are definitely put off by the whole &quot;abstraction of<br>
&gt; abstractions of abstraction&quot; thing. I think we probably just need some more<br>
&gt; concrete examples to weight it down and make it seem like something<br>
&gt; applicable to the real world.<br>
&gt;<br>
&gt; (Thus far, I have convinced exactly *one* person to start learning Haskell.<br>
&gt; This person being something of a maths nerd, their main complaint was not<br>
&gt; about naming or abstraction, but about the &quot;implicitness&quot; of the language,<br>
&gt; and the extreme difficulty of visually parsing it. Perhaps not surprising<br>
&gt; comming from a professional C++ programmer...)<br>
&gt;<br>
&gt;&gt; At the same time, I think everyone is arguing *for* better documentation.<br>
&gt;&gt; And you&#39;re probably right: better documentation will bring the abstract<br>
&gt;&gt; nonsense down to earth somewhat.<br>
&gt;<br>
&gt; Amen!<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
<br>
<br>
------------------------------<br>
<br>
Message: 15<br>
Date: Sat, 17 Jan 2009 07:37:30 -0800<br>
From: David Leimbach &lt;<a href="mailto:leimy2k@gmail.com" target="_blank">leimy2k@gmail.com</a>&gt;<br>
Subject: Re: [Haskell-cafe] Comments from OCaml Hacker Brian Hurt<br>
To: Lennart Augustsson &lt;<a href="mailto:lennart@augustsson.net" target="_blank">lennart@augustsson.net</a>&gt;<br>
Cc: <a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a><br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:3e1162e60901170737j360fad4br492c053277f6f84@mail.gmail.com" target="_blank">3e1162e60901170737j360fad4br492c053277f6f84@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;iso-8859-1&quot;<br>
<br>
On Sat, Jan 17, 2009 at 7:33 AM, Lennart Augustsson<br>
&lt;<a href="mailto:lennart@augustsson.net" target="_blank">lennart@augustsson.net</a>&gt;wrote:<br>
<br>
&gt; Thinking that Functor allows you to apply a function to all elements<br>
&gt; in a collection is a good intuitive understanding. &nbsp;But fmap also<br>
&gt; allows applying a function on &quot;elements&quot; of things that can&#39;t really<br>
&gt; be called collections, e.g., the continuation monad.<br>
<br>
<br>
I hadn&#39;t even thought about fmap for continuations... interesting!<br>
<br>
It falls out of the logic though doesn&#39;t it?<br>
<br>
I&#39;m not one to throw all the cool mathematical and logical thinking out for<br>
&quot;simpler terms&quot; or not covering the full usefulness of certain abstractions.<br>
<br>
I know Haskell allows for lazy evaluation (as an implementation of<br>
non-strictness) but Haskell programmers are NOT allowed to be lazy :-)<br>
<br>
Try learning the terms that are there... and ask for help if you need<br>
help... most of us are pretty helpful!<br>
<br>
Improving documentation can pretty much *always* be done on any project, and<br>
it looks like that&#39;s coming out of this long thread that won&#39;t die, so kudos<br>
to the ones being the gadflies in this instance. &nbsp;It really looked at first<br>
like a long troll, but I think something very useful is going to come out of<br>
this!<br>
<br>
Dave<br>
<br>
<br>
&gt;<br>
&gt;<br>
&gt; &nbsp;-- Lennart<br>
&gt;<br>
&gt; On Sat, Jan 17, 2009 at 11:17 AM, Andrew Coppin<br>
&gt; &lt;<a href="mailto:andrewcoppin@btinternet.com" target="_blank">andrewcoppin@btinternet.com</a>&gt; wrote:<br>
&gt; &gt; Cory Knapp wrote:<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Actually, that was part of my point: When I mention Haskell to people,<br>
&gt; and<br>
&gt; &gt;&gt; when I start describing it, they&#39;re generally frightened enough by the<br>
&gt; focus<br>
&gt; &gt;&gt; on pure code and lazy evaluation-- add to this the inherently abstract<br>
&gt; &gt;&gt; nature, and we can name typeclasses &quot;cuddlyKitten&quot;, and the language is<br>
&gt; &gt;&gt; still going to scare J. R. Programmer. By &quot;inherently mathematical<br>
&gt; nature&quot;,<br>
&gt; &gt;&gt; I didn&#39;t mean names like &quot;monoid&quot; and &quot;functor&quot;, I meant *concepts* like<br>
&gt; &gt;&gt; monoid and functor. Not that either of them are actually terribly<br>
&gt; difficult;<br>
&gt; &gt;&gt; the problem is that they are terribly abstract. That draws a lot of<br>
&gt; people<br>
&gt; &gt;&gt; (especially mathematicians), but most people who aren&#39; drawn by that are<br>
&gt; &gt;&gt; hugely put off-- whatever the name is. So, I guess my point is that the<br>
&gt; name<br>
&gt; &gt;&gt; is irrelevant: the language is going to intimidate a lot of people who<br>
&gt; are<br>
&gt; &gt;&gt; intimidated by the vocabulary.<br>
&gt; &gt;<br>
&gt; &gt; Oh, I don&#39;t know. I have no idea what the mathematical definition of<br>
&gt; &gt; &quot;functor&quot; is, but as far as I can tell, the Haskell typeclass merely<br>
&gt; allows<br>
&gt; &gt; you to apply a function simultaneously to all elements of a collection.<br>
&gt; &gt; That&#39;s pretty concrete - and trivial. If it weren&#39;t for the seemingly<br>
&gt; &gt; cryptic name, nobody would think twice about it. (Not sure exactly what<br>
&gt; &gt; you&#39;d call it though...)<br>
&gt; &gt;<br>
&gt; &gt; A monoid is a rather more vague concept. (And I&#39;m still not really sure<br>
&gt; why<br>
&gt; &gt; it&#39;s useful on its own. Maybe I just haven&#39;t had need of it yet?)<br>
&gt; &gt;<br>
&gt; &gt; I think, as somebody suggested about &quot;monad&quot;, the name does tend to<br>
&gt; inspire<br>
&gt; &gt; a feeling of &quot;hey, this must be really complicated&quot; so that even after<br>
&gt; &gt; you&#39;ve understood it, you end up wondering whether there&#39;s still<br>
&gt; something<br>
&gt; &gt; more to it than that.<br>
&gt; &gt;<br>
&gt; &gt; But yes, some people are definitely put off by the whole &quot;abstraction of<br>
&gt; &gt; abstractions of abstraction&quot; thing. I think we probably just need some<br>
&gt; more<br>
&gt; &gt; concrete examples to weight it down and make it seem like something<br>
&gt; &gt; applicable to the real world.<br>
&gt; &gt;<br>
&gt; &gt; (Thus far, I have convinced exactly *one* person to start learning<br>
&gt; Haskell.<br>
&gt; &gt; This person being something of a maths nerd, their main complaint was not<br>
&gt; &gt; about naming or abstraction, but about the &quot;implicitness&quot; of the<br>
&gt; language,<br>
&gt; &gt; and the extreme difficulty of visually parsing it. Perhaps not surprising<br>
&gt; &gt; comming from a professional C++ programmer...)<br>
&gt; &gt;<br>
&gt; &gt;&gt; At the same time, I think everyone is arguing *for* better<br>
&gt; documentation.<br>
&gt; &gt;&gt; And you&#39;re probably right: better documentation will bring the abstract<br>
&gt; &gt;&gt; nonsense down to earth somewhat.<br>
&gt; &gt;<br>
&gt; &gt; Amen!<br>
&gt; &gt;<br>
&gt; &gt; _______________________________________________<br>
&gt; &gt; Haskell-Cafe mailing list<br>
&gt; &gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; &gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt; &gt;<br>
&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <a href="http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/e8634f33/attachment-0001.htm" target="_blank">http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/e8634f33/attachment-0001.htm</a><br>


<br>
------------------------------<br>
<br>
Message: 16<br>
Date: Sat, 17 Jan 2009 06:21:36 -1000 (HST)<br>
From: Tim Newsham &lt;<a href="mailto:newsham@lava.net" target="_blank">newsham@lava.net</a>&gt;<br>
Subject: Re: [Haskell-cafe] ANN: HTTPbis / HTTP-4000.x package<br>
 &nbsp; &nbsp; &nbsp; &nbsp;available<br>
To: Henning Thielemann &lt;<a href="mailto:schlepptop@henning-thielemann.de" target="_blank">schlepptop@henning-thielemann.de</a>&gt;<br>
Cc: Haskell Cafe &lt;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>&gt;<br>
Message-ID: &lt;<a href="mailto:Pine.BSI.4.64.0901170621100.10489@malasada.lava.net" target="_blank">Pine.BSI.4.64.0901170621100.10489@malasada.lava.net</a>&gt;<br>
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed<br>
<br>
&gt; There&#39;s however still no framework which supports both HTTP client and<br>
&gt; server functions using the same Request and Response data type, right? I<br>
&gt; don&#39;t know whether I am the only one who needs this (e.g. for the Real<br>
&gt; Monad Transformer). E.g. a proxy would need this, too.<br>
<br>
I&#39;ve wanted this for a while now. &nbsp;&quot;Me Too.&quot;<br>
<br>
Tim Newsham<br>
<a href="http://www.thenewsh.com/%7Enewsham/" target="_blank">http://www.thenewsh.com/~newsham/</a><br>
<br>
<br>
------------------------------<br>
<br>
Message: 17<br>
Date: Sat, 17 Jan 2009 16:46:12 +0000<br>
From: Phil &lt;<a href="mailto:pbeadling@mail2web.com" target="_blank">pbeadling@mail2web.com</a>&gt;<br>
Subject: [Haskell-cafe] Efficient Factoring Out of Constants<br>
To: Luke Palmer &lt;<a href="mailto:lrpalmer@gmail.com" target="_blank">lrpalmer@gmail.com</a>&gt;, &nbsp; &quot;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>&quot;<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>&gt;<br>
Message-ID: &lt;<a href="mailto:C597BBD4.28E0%25pbeadling@mail2web.com" target="_blank">C597BBD4.28E0%pbeadling@mail2web.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;iso-8859-1&quot;<br>
<br>
Hi,<br>
<br>
Iıve been thinking about factoring constants out of iterations and have<br>
spotted another place in my code where I can make use of this.<br>
<br>
See the two examples below ­ the first example iterates over the mcSimulate<br>
function ­ this has changed a little bit but essentially still recurses<br>
around passing in<br>
two constants, and two variables that are changed each time it is called ­<br>
it has the following form:<br>
<br>
mcSimulate (startStock, endTime, seedForSeed, runningSum) = ( startStock,<br>
endTime, newSeedForSeed, newRunningSum )<br>
<br>
I figured Iım passing around the constants startStock and endTime so looked<br>
factor these out producing the second example below.<br>
<br>
My concern is that although iterate function now only handles two variables,<br>
itıs still passing around 1 tuple, which under the bonnet is likely to be<br>
represented in machine code as a pointer? &nbsp;Humor me here a little ­ I know<br>
Iım thinking of this in terms of C++, but Iım guessing the final byte code<br>
will adhere to this:<br>
<br>
Thus each time mcSimulate is called &nbsp;a machine code subroutine will be<br>
passed a memory address to the input data. &nbsp;Now, the crux of this is, will<br>
it make a COPY of the old input data, BUT with the newSeedForSeed and<br>
newRunningSum, to pass to the next iteration? &nbsp;If this is the case each<br>
iteration does two useless copies of startStock and endTime? &nbsp;Here the<br>
second example should produce better code because nothing constant is copied<br>
from 1 iteration to the next. &nbsp;However if the compiler is smarter and simply<br>
REPLACES the modified data the second example buys us nothing.<br>
<br>
However, again, depending very much on the compiler, the second example may<br>
actually be less efficient. &nbsp;Letıs say the compiler is super smart and<br>
doesnıt copy around the startStock and endTime on each iteration in the<br>
first example. &nbsp;Then weıve gained nothing. &nbsp;However the second example Will<br>
call 3 functions each iteration:<br>
<br>
mcWrapper -&gt; mcSimulate -&gt; getStateInfo<br>
<br>
In the second example we probably have something like 6 ŒJMPı statements in<br>
machine code ­ 3 to jump in to each function, and 3 to jump back out. &nbsp;In<br>
the first we have 2 ­ one to jump us into mcSimulate and one to return. &nbsp;So<br>
each iteration executes 4 more JMPs in the second example. &nbsp;All others<br>
things being equal this will produce slightly less efficient code.<br>
<br>
Now I know Iım speculating like crazy, and perhaps Iım drunk with efficiency<br>
here, but it would seem to me that whatever way it works there will be a<br>
certain critical mass of constant data that you can carry around that once<br>
breached (i.e. When the copy operations exceed the CPU time taken for the 4<br>
extra JMPs) you will be better off factoring the constant data out..... That<br>
is assuming any of my analysis is correct :-)<br>
<br>
If anyone has any insight into how this might looked once compiled down to<br>
machine code, or has an opinion one which example below makes for better<br>
Haskell, Iıd be grateful for any comments, advice or discussion.<br>
<br>
Cheers,<br>
<br>
Phil.<br>
<br>
Note: &nbsp;I recognize the use of getSum and getStateInfo could be polished<br>
using data structures instead, and the use of !! will not produce strict<br>
evaluation.<br>
-------------<br>
<br>
getSum :: (Double, Double, Word64, Double) -&gt; Double<br>
getSum (startStock, endTime, seedForSeed, runningSum) = runningSum<br>
<br>
getAveragePayoff :: Double -&gt; Double -&gt; Int -&gt; Word64 -&gt; Double<br>
getAveragePayoff startStock endTime iterations seedForSeed = average<br>
 &nbsp;where<br>
 &nbsp; &nbsp;average = (getSum $ (iterate mcSimulate (startStock, endTime,<br>
seedForSeed, 0)) !! iterations ) / fromIntegral iterations<br>
<br>
---------------<br>
<br>
getStateInfo :: (Double, Double, Word64, Double) -&gt; (Word64,Double)<br>
getStateInfo (startStock, endTime, seedForSeed, runningSum) = (seedForSeed,<br>
runningSum)<br>
<br>
getAveragePayoff :: Double -&gt; Double -&gt; Int -&gt; Word64 -&gt; Double<br>
getAveragePayoff startStock endTime iterations seedForSeed = average<br>
 &nbsp;where<br>
 &nbsp; &nbsp;average = &nbsp;(snd $ (iterate mcWrapper (seedForSeed,0)) !! iterations ) /<br>
fromIntegral iterations<br>
 &nbsp; &nbsp; &nbsp;where<br>
 &nbsp; &nbsp; &nbsp; &nbsp;mcWrapper = \(seed,runningSum) -&gt; getStateInfo $ mcSimulate (<br>
startStock, endTime, seed, runningSum )<br>
<br>
<br>
On 16/01/2009 01:41, &quot;Phil&quot; &lt;<a href="mailto:pbeadling@mail2web.com" target="_blank">pbeadling@mail2web.com</a>&gt; wrote:<br>
<br>
&gt;<br>
&gt; On 16/01/2009 01:28, &quot;Luke Palmer&quot; &lt;<a href="mailto:lrpalmer@gmail.com" target="_blank">lrpalmer@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt;&gt; Compile-time constants could be handled by simple top-level bindings. &nbsp;This<br>
&gt;&gt;&gt; technique is specifically for the case you are after:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; mcSimulate :: Double -&gt; Double -&gt; Word64 -&gt; [Double]<br>
&gt;&gt;&gt; mcSimulate startStock endTime seedForSeed = go seedForSeed<br>
&gt;&gt;&gt; &nbsp; where<br>
&gt;&gt;&gt; &nbsp; &nbsp; go = fst expiryStock : go newSeedForSeed<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp; where<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp; expiryStock = iterate evolveUnderlying (startStock, ranq1Init<br>
&gt;&gt;&gt; seedForSeed)<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; !! truncate (endTime/timeStep)<br>
&gt;&gt;&gt; &nbsp; &nbsp; &nbsp; newSeedForSeed = seedForSeed + 246524<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; See what&#39;s going on there?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I don&#39;t know about that nested where. &nbsp;In Real Life I would probably use a<br>
&gt;&gt;&gt; let instead for expiryStock and newSeedForSeed.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Luke<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Ahh, I get it now, thatıs pretty neat - Œgoı is only updating the<br>
&gt;&gt;&gt; seedForSeed and the expiryStock, the inner Œwhereı clause keeps everything<br>
&gt;&gt;&gt; else constant each time it is called.<br>
&gt;<br>
&gt; Thanks again!<br>
&gt;<br>
&gt; Phil.<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <a href="http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/0b7a57ea/attachment-0001.htm" target="_blank">http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/0b7a57ea/attachment-0001.htm</a><br>


<br>
------------------------------<br>
<br>
Message: 18<br>
Date: Sat, 17 Jan 2009 09:55:27 -0700<br>
From: Luke Palmer &lt;<a href="mailto:lrpalmer@gmail.com" target="_blank">lrpalmer@gmail.com</a>&gt;<br>
Subject: [Haskell-cafe] Re: Efficient Factoring Out of Constants<br>
To: <a href="mailto:phil@beadling.co.uk" target="_blank">phil@beadling.co.uk</a><br>
Cc: &quot;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>&quot; &lt;<a href="mailto:haskell-cafe@haskell.org" target="_blank">haskell-cafe@haskell.org</a>&gt;<br>
Message-ID:<br>
 &nbsp; &nbsp; &nbsp; &nbsp;&lt;<a href="mailto:7ca3f0160901170855n146bb029s5688e2e56411401d@mail.gmail.com" target="_blank">7ca3f0160901170855n146bb029s5688e2e56411401d@mail.gmail.com</a>&gt;<br>
Content-Type: text/plain; charset=&quot;windows-1252&quot;<br>
<br>
On Sat, Jan 17, 2009 at 9:46 AM, Phil &lt;<a href="mailto:pbeadling@mail2web.com" target="_blank">pbeadling@mail2web.com</a>&gt; wrote:<br>
<br>
&gt; &nbsp;In the second example we probably have something like 6 &#39;JMP&#39; statements<br>
&gt; in machine code – 3 to jump in to each function, and 3 to jump back out. &nbsp;In<br>
&gt; the first we have 2 – one to jump us into mcSimulate and one to return. &nbsp;So<br>
&gt; each iteration executes 4 more JMPs in the second example. &nbsp;All others<br>
&gt; things being equal this will produce slightly less efficient code.<br>
&gt;<br>
<br>
Wow. &nbsp;I strongly suggest you forget about efficiency completely and become a<br>
proficient high-level haskeller, and then dive back in. &nbsp;Laziness changes<br>
many runtime properties, and renders your old ways of thinking about<br>
efficiency almost useless.<br>
<br>
If you are interested, though, you can use the ghc-core tool on hackage to<br>
look at the core (lowish-level intermediate language) and even the generated<br>
assembly for minimal cases. &nbsp;It&#39;s dense, but interesting if you have the<br>
time to study it.<br>
<br>
Others will know more about this specific speculation than I.<br>
<br>
Luke<br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <a href="http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/798c4336/attachment.htm" target="_blank">http://www.haskell.org/pipermail/haskell-cafe/attachments/20090117/798c4336/attachment.htm</a><br>


<br>
------------------------------<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br>
<br>
End of Haskell-Cafe Digest, Vol 65, Issue 48<br>
********************************************<br>
</blockquote></div><br>