[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