
Excerpts from Roman Cheplyaka's message of Sat Dec 08 14:00:52 -0800 2012:
* Edward Z. Yang
[2012-12-08 11:19:01-0800] The monoid instance is necessary to ensure adherence to the monad laws.
This doesn't make any sense to me. Are you sure you're talking about the MonadWriter class and not about the Writer monad?
Well, I assume the rules for Writer generalize for MonadWriter, no? Here's an example. Haskell monads have the associativity law: (f >=> g) >=> h === f >=> (g >=> h)
From this, we can see that
(m1 >> m2) >> m3 === m1 >> (m2 >> m3) Now, consider tell. We'd expect it to obey a law like this: tell w1 >> tell w2 === tell (w1 <> w2) Combine this with the monad associativity law: (tell w1 >> tell w2) >> tell w3 === tell w1 >> (tell w2 >> tell w3) And it's easy to see that '<>' must be associative in order for this law to be upheld. Additionally, the existence of identities in monads means that there must be a corresponding identity for the monoid. So anything that is "writer-like" and also satisfies the monad laws... is going to be a monoid. Now, it's possible what GP is actually asking about is more a question of encapsulation. Well, one answer is, "Well, just give the user specialized functions which do the appropriate wrapping/unwrapping"; another answer is, "if you let the user run a writer action and extract the resulting written value, then he can always reverse engineer the monoid instance out of it". Edward