[Haskell-cafe] do-notation for building monoid values
Olaf Klinke
olf at aatal-apotheke.de
Thu Mar 8 13:02:16 UTC 2018
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
More information about the Haskell-Cafe
mailing list