
David, Kim-Ee, thank you both very much - this really helped make my code good looking! Martin Kim-Ee Yeoh:
Hi Martin,
But the compiler complains about ambiguous type for the writer reult I am ignoring (message in the above lpaste).
There are a number of types going on here, and the one that's ambiguous is the monoid w in WriterT w m a.
Normally I think the way around this is to provide explicit type annotation for "foldIt", but in this case the result type depends on the type of "a" in foldrEntries type and I don't know how to express this and make the compiler happy.
David's ScopedTypeVariables solution is perfectly cromulent. Here's another one without any pragmas:
foldrEntries :: (Entry -> a -> a) -> a -> (String -> a) -> Entries -> a foldrEntries next done fail' = isoR . foldrEntriesW (isoL .: next) (isoL done) (isoL . fail') where isoL :: a -> WriterT () Identity a isoL = return isoR :: WriterT () Identity a -> a isoR = fst . runIdentity . runWriterT
The (.:) is from Data.Composition.
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.
Do eschew verbosities like "return . fst =<< runWriterT". (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.
(I was able to make it work by calling "tell ()", basically writing a dummy value, which lets compiler know what the type is, but this is not so good - I don't want to make artificial function calls like this.)
Good call.
-- Kim-Ee
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners