[Haskell-cafe] do-notation for building monoid values

Brandon Allbery allbery.b at gmail.com
Fri Mar 9 00:48:25 UTC 2018


The mconcat method is also how xmonad handles its ManageHooks, which are
basically Endo Monoids.

On Thu, Mar 8, 2018 at 8:48 AM, Andrew Martin <andrew.thaddeus at gmail.com>
wrote:

> I do the same thing that Merijn does. It works really well.
>
> On Thu, Mar 8, 2018 at 8:08 AM, Merijn Verstraaten <merijn at inconsistent.nl
> > wrote:
>
>> I always just use mconcat and lists, so instead of:
>> > complicatedValue = execWriter $ do
>> >  component1
>> >  component2
>> >  modifier $ do
>> >    component3
>> >    component4
>>
>> I write:
>>
>> complicatedValue = mconcat
>>     [ component1
>>     , component2
>>     , modifier . mconcat $ [component3, component4]
>>     ]
>>
>> Alternatively, if component3 and component4 are really long or lots of
>> them linewrap those too:
>>
>> complicatedValue = mconcat
>>     [ component1
>>     , component2
>>     , modifier . mconcat $
>>         [ component3
>>         , component4
>>         ]
>>     ]
>>
>> Cheers,
>> Merijn
>>
>> > On 8 Mar 2018, at 14:02, Olaf Klinke <olf at aatal-apotheke.de> wrote:
>> >
>> > Dear cafe,
>> >
>> > prompted by a discussion with the author of blaze-markup [1] I realized
>> a pattern and would like to know whether other haskellers have exploited
>> this/find this useful:
>> >
>> > For every monoid m, the types Writer m () and m are isomorphic as types
>> via tell and execWriter. Moreover, Writer m is a monad if and only if m is
>> a monoid. For every monad t, the type t () is a monoid with
>> >   mempty = return ()
>> >   mappend = (>>).
>> > In the particular case of Writer m () and m, the isomorphism of Haskell
>> types is in fact an isomorphism of monoids, that is, the functions tell and
>> execWriter preserve the monoid operations.
>> >
>> > This enables us to use do-notation in building complicated values of
>> any monoid type, e.g. Text or any other syntax. Instead of writing
>> >
>> > complicatedValue = component1 <>
>> >  component2 <>
>> >  modifier (component3 <> component4)
>> >
>> > one can write
>> >
>> > complicatedValue = execWriter $ do
>> >  component1
>> >  component2
>> >  modifier $ do
>> >    component3
>> >    component4
>> >
>> > Should such an idiom be encouraged/discouraged? How do you handle the
>> construction of monoid values (especially text-like) with interspersed
>> function applications (e.g. show, prettyprint)?
>> >
>> > Regards,
>> > Olaf
>> >
>> > [1] https://github.com/jaspervdj/blaze-markup/issues/36
>> > _______________________________________________
>> > Haskell-Cafe mailing list
>> > To (un)subscribe, modify options or view archives go to:
>> > http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>> > Only members subscribed via the mailman list are allowed to post.
>>
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> To (un)subscribe, modify options or view archives go to:
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>> Only members subscribed via the mailman list are allowed to post.
>>
>
>
>
> --
> -Andrew Thaddeus Martin
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.
>



-- 
brandon s allbery kf8nh                               sine nomine associates
allbery.b at gmail.com                                  ballbery at sinenomine.net
unix, openafs, kerberos, infrastructure, xmonad        http://sinenomine.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180308/93dd0092/attachment.html>


More information about the Haskell-Cafe mailing list