[Haskell-cafe] do-notation for building monoid values
Merijn Verstraaten
merijn at inconsistent.nl
Thu Mar 8 13:08:31 UTC 2018
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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 874 bytes
Desc: Message signed with OpenPGP
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180308/a87ec7d8/attachment.sig>
More information about the Haskell-Cafe
mailing list