<div dir="ltr"><div class="gmail_quote">Hi Martin,<br><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="overflow:hidden">
But the compiler complains about ambiguous type for the writer reult I<br>
am ignoring (message in the above lpaste).<br></div></blockquote><div><br></div><div>There are a number of types going on here, and the one that's ambiguous is the monoid w in WriterT w m a.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="overflow:hidden">
Normally I think the way around this is to provide explicit type<br>
annotation for "foldIt", but in this case the result type depends on the<br>
type of "a" in foldrEntries type and I don't know how to express this<br>
and make the compiler happy.<br></div></blockquote><div> </div><div>David's ScopedTypeVariables solution is perfectly cromulent. Here's another one without any pragmas:<br><br>foldrEntries ::<br>      (Entry -> a -> a) <br>   -> a <br>   -> (String -> a)<br>   -> Entries <br>   -> a<br>foldrEntries next done fail' = <br>   isoR . foldrEntriesW (isoL .: next) (isoL done) (isoL . fail')<br>   where<br>   isoL :: a -> WriterT () Identity a<br>   isoL = return<br>   isoR :: WriterT () Identity a -> a<br>   isoR = fst . runIdentity . runWriterT<br><br></div><div>The (.:) is from Data.Composition.<br><br>The isoL and isoR witness the isomorphism, and foldrEntries is written in a point-minimized form that makes it transparent that it's a specialization of foldrEntriesW.<br><br></div><div><span style="font-family:arial,helvetica,sans-serif">Do eschew verbosities like "</span><span style="font-family:arial,helvetica,sans-serif"><span class="hs-varid">return</span> <span class="hs-varop">.</span> <span class="hs-varid">fst</span> <span class="hs-varop">=<<</span> <span class="hs-varid">runWriterT</span><span class="hs-varid">". (Hlint should be programmed to catch this. It doesn't yet.) A return that's too near a monadic bind sets off alarms among professional haskell engineers.</span></span><span style="font-family:arial,helvetica,sans-serif"></span></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="overflow:hidden">
(I was able to make it work by calling "tell ()", basically writing a<br>
dummy value, which lets compiler know what the type is, but this is not<br>
so good - I don't want to make artificial function calls like this.)</div></blockquote></div><div class="gmail_extra"><br></div><div class="gmail_extra">Good call.<br></div><div class="gmail_extra"><br clear="all"><div><div>-- Kim-Ee</div></div>
</div></div>