On Fri, Jun 08, 2007 at 07:24:09AM -0700, Alex Jacobson wrote: > Dan Piponi wrote: > >On 6/7/07, Alex Jacobson <[EMAIL PROTECTED]> wrote: > >>Is there a standard class that looks something like this: > >> > >>class (Monoid m) => MonoidBreak m where > >> mbreak::a->m a->(m a,m a) > > > >I think you have some kind of kind issue going on here. If m is a > >Monoid I'm not sure what m a means. Looks like you're trying to factor > >elements of monoids in some way. Maybe you mean > > > >class (Monoid m) => MonoidBreak m where > > mbreak::a->m->(m,m) > > > >Though I'm not sure what the relationship between m and a is intended > >to be. > > Ok how about this class: > > class (Monoid m) => MonoidBreak m where > mbreak::m->m->m > > And the condition is > > mappend (mbreak y z) y == z
Consider baz x = mbreak x mempty now: baz x `mappend` x = mappend (mbreak x mempty) x = mempty Thus, baz is a left-inverse operator, and (m, mappend, mempty, baz) forms a group. Going the other way using a hypothetical Group class: instance Group m => MonoidBreak m where mbreak n p = p `mappend` negate n satisfies your law. Stefan _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe