
On Tue, Jan 13, 2009 at 5:19 PM, Dan Doel
On Tuesday 13 January 2009 5:51:09 pm Luke Palmer wrote:
On Tue, Jan 13, 2009 at 11:21 AM, Tim Newsham
wrote: I have seen several libraries where all functions of a monad have the
monadic result (), e.g. Binary.Put and other writing functions. This is a clear indicator, that the Monad instance is artificial and was only chosen because of the 'do' notation.
Maybe that was the initial reason, but I've actually found the Binary.Put.PutM (where Put = PutM ()) to be useful. Sometimes your putter does need to propogate a result...
But that's the whole point of Writer! Take a monoid, make it into a monad. Put as a monad is silly.
You mean it should be Writer instead?
Or rather, PutM should not exist (or be exposed), and Put should just be a monoid.
When GHC starts optimizing (Writer Builder) as well as it optimizes PutM, then that will be a cogent argument. Until then, one might argue that it misses "the whole point of Put".
Well it can still serve as an optimization over bytestrings using whatever trickery it uses (I am assuming here -- I am not familiar with its trickery), the same way DList is an optimization over List. It's just that its monadiness is superfluous. Surely PutM and Writer Put have almost the same performance?! (I am worried if not -- if not, can you give an indication why?) Luke