[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