[Haskell-cafe] do-notation for building monoid values
Andrew Martin
andrew.thaddeus at gmail.com
Thu Mar 8 13:48:38 UTC 2018
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180308/87e77f12/attachment.html>
More information about the Haskell-Cafe
mailing list