Thanks, David.<div>I&#39;m quite relieved to know there is a better way to make a correct/full use of the standard library.</div><div>&quot;newtype&quot; seems powerful, but in this case I learned through my hardship that</div>
<div>[1] it deviates from good use of the library, and even worse </div><div>[2] I had to instantiate the &quot;tell&quot; myself. - despite of DRY pricipal.</div><div>The author may have a different intent to teach me &quot;newtype&quot; example, but... oh well.</div>
<div>Thanks again for your kind elaboration.</div><div>TJ</div><div><br><br><div class="gmail_quote">On Sun, Jan 15, 2012 at 11:52 PM, David McBride <span dir="ltr">&lt;<a href="mailto:toad3k@gmail.com">toad3k@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Reading that chapter, he seemed to have veered off course at some<br>
point.  He started having you implement your own simple writer type,<br>
but he stopped short of actually making it usable, then he started<br>
showing you how you would use the real writer class.  Unless I&#39;m<br>
mistaken, he also didn&#39;t tell you how to reimplement logNumber with<br>
the real library, so of course the code didn&#39;t work.<br>
<br>
So the tell class is part of the MonadWriter class, which he didn&#39;t<br>
explain the point of (along with listen).  Tell just takes a list of<br>
things and adds them to the list of things you have.  The reason why<br>
his Writer class has a tuple, is that in addition to concatenating log<br>
messages, when you do a return from runWriter, you will get a first<br>
argument in a tuple.  That argument ends up being the last item that<br>
was returned or the last value returned from any monad passed as an<br>
argument into listen.<br>
<br>
Why would it do that?  Well I don&#39;t think it is used very often (or<br>
possibly at all), but originally the idea was that the writer monad<br>
can encompass both the ability to track what has happened in a program<br>
and also its final return value.  I&#39;m having trouble thinking of a use<br>
for it, perhaps returning a failure code from a compilation, as well<br>
as the log of messages?  Generally if you wanted to keep state you<br>
would use the state monad for something like that, which allows you to<br>
query it as well as set it.<br>
<br>
The actual running code that you would have at that point in the book would be:<br>
<br>
import Data.Monoid<br>
import Control.Monad.Writer<br>
<div class="im"><br>
logNumber :: Int -&gt; Writer [String] Int<br>
</div>logNumber x = do<br>
  tell [&quot;Got number: &quot; ++ show x]<br>
  return x<br>
<div class="im"><br>
multWithLog :: Writer [String] Int<br>
multWithLog = do<br>
    a &lt;- logNumber 3<br>
    b &lt;- logNumber 5<br>
    tell [&quot;Gonna multiply these two&quot;]<br>
    return (a*b)<br>
<br>
main = putStrLn . show $ runWriter multWithLog<br>
<br>
</div>which returns<br>
(15,[&quot;Got number: 3&quot;,&quot;Got number: 5&quot;,&quot;Gonna multiply these two&quot;])<br>
<div class="HOEnZb"><div class="h5"><br>
On Sun, Jan 15, 2012 at 8:07 PM, TJ Takei &lt;<a href="mailto:tj.takei@gmail.com">tj.takei@gmail.com</a>&gt; wrote:<br>
&gt; Hi<br>
&gt;<br>
&gt; I have a trouble to run an example of &quot;Learn Your A Haskell..&quot; Chap 13<br>
&gt; below:<br>
&gt;<br>
&gt; ========<br>
&gt; import Data.Monoid<br>
&gt; --Don&#39;t import Control.Monad.Writer<br>
&gt;<br>
&gt; newtype Writer w a = Writer { runWriter :: (a, w) }<br>
&gt;<br>
&gt; instance (Monoid w) =&gt; Monad (Writer w) where<br>
&gt;     return x = Writer (x, mempty)<br>
&gt;     (Writer (x,v)) &gt;&gt;= f = let (Writer (y, v&#39;)) = f x in Writer (y, v<br>
&gt; `mappend` v&#39;)<br>
&gt;<br>
&gt; --Define tell<br>
&gt; tell :: [String] -&gt; Writer [String] Int<br>
&gt; tell w = Writer (0, w)  -- what&#39;sa hell &quot;0&quot; for ???!!!<br>
&gt;<br>
&gt; logNumber :: Int -&gt; Writer [String] Int<br>
&gt; logNumber x = Writer (x, [&quot;Got number: &quot; ++ show x])<br>
&gt;<br>
&gt; multWithLog :: Writer [String] Int<br>
&gt; multWithLog = do<br>
&gt;     a &lt;- logNumber 3<br>
&gt;     b &lt;- logNumber 5<br>
&gt;     tell [&quot;Gonna multiply these two&quot;]<br>
&gt;     return (a*b)<br>
&gt;<br>
&gt; main = putStrLn . show $ runWriter multWithLog<br>
&gt; ========<br>
&gt;<br>
&gt; I changed two places to run it without error:<br>
&gt; [1] Ambiguity error of Writer, uneless I comment out &quot;import<br>
&gt; Control.Monad.Writer&quot;, and<br>
&gt; [2] Define tell function<br>
&gt;<br>
&gt; My questions are:<br>
&gt; Why does LYAH sample fail as is?<br>
&gt; Do the changes above look reasonable?<br>
&gt; I&#39;m not certain about my &quot;tell&quot;. Where is the correct instantiation of<br>
&gt; &quot;tell&quot; included?<br>
&gt;<br>
&gt; Thanks,<br>
&gt; TJ<br>
&gt;<br>
&gt;<br>
</div></div><div class="HOEnZb"><div class="h5">&gt; _______________________________________________<br>
&gt; Beginners mailing list<br>
&gt; <a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
&gt;<br>
</div></div></blockquote></div><br></div>