On Thu, Jan 15, 2009 at 9:15 AM, John Goerzen <span dir="ltr">&lt;<a href="mailto:jgoerzen@complete.org">jgoerzen@complete.org</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
If you&#39;re learning Haskell, which communicates the idea more clearly:<br>
<br>
&nbsp;* Appendable<br>
<br>
or<br>
<br>
&nbsp;* Monoid</blockquote><div><br>But Appendable is wrong.&nbsp; <br><br><span style="font-family: courier new,monospace;">merge :: Ord a =&gt; [a] -&gt; [a] -&gt; [a]</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">merge [] ys = ys</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">merge xs [] = xs</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">merge (x:xs) (y:ys) | x &lt;= y = x : merge xs (y:ys)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | otherwise = y : merge (x:xs) ys</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">newtype MergeList a = MergeList [a]</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">instance (Ord a) =&gt; Monoid (MergeList a) where</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; mempty = MergeList []</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">&nbsp;&nbsp;&nbsp; mappend (MergeList xs) (MergeList ys) = MergeList (merge xs ys)</span><br><font face="comic sans ms,sans-serif"></font> <br>This is a perfectly good monoid -- one I have used -- but in no sense would I call MergeList &quot;appendable&quot;. <br>
<br>Also, in what sense is mappend on Endo appending?<br><br>I just realized that the name &quot;mappend&quot; sucks :-).&nbsp; (++) would be great!<br><br>In any case, to me being a Monoid is about having an associative operator, not about &quot;appending&quot;.&nbsp; The only fitting terms I can think of are equally scary ones such as &quot;semigroup&quot;.<br>
<br>Which is worse: naming things with scary category names, as in &quot;monad&quot; and &quot;monoid&quot;, or naming things with approachable popular names that are wrong (wrt. to their popular usage), as in &quot;class&quot; and &quot;instance&quot;.<br>
<br>In the former case, the opinion becomes &quot;Haskell is hard -- what the hell is a monad?&quot;; in the latter it becomes &quot;Haskell sucks -- it&#39;s class system is totally stupid&quot; because we are <i>violating</i> people&#39;s intuitions, rather than providing them with none whatsoever.<br>
<br>In a lot of cases there is a nice middle ground.&nbsp; Cases where (1) we can find an intuitive word that does not have a popular CS meaning, or (2) where the popular CS meaning is actually correct (&quot;integer&quot;?).&nbsp; But eg. programming with monads <i>changes the way you think</i>; we cannot rewire people&#39;s brains just-in-time with a word. <br>
<br>I like the word Monad.&nbsp; It makes people know they have to work hard to understand them.&nbsp; <i></i><br><br>Luke<br></div></div><br>