Not an article, just some reflections on this idea…
You know what is a monoid?
 a binary operation taking 2 elements and giving another element
e x e > e
(aka a SemiGroup)  a Identity
id
elementid . e = e . id = e
(also called zero element)
(and some associativity)
In scalaz, here is the definition:
1 2 3 4 5 6 7 

You can see the zero
& the SemiGroup.append
operations, right?
So you can write a Monoid[Int]
or Monoid[List[A]]
as those structures are monoids.
Now let’s consider HList
the heterogenous List provided by Miles Sabin’s fantastic Shapeless. HList
looks like a nice monoid.
1


What about writing a monoid for HList
?
Scalaz monoid isn’t very helpful because our monoid operations would look like:
1 2 

So, to be able to write a Monoid of HList
, we need something else based on multiple different types…
I spent a few hours having fun on this idea with Shapeless and tried to implement a Monoid for heterogenous structures like HList
, Nat
, Sized
and even not heterogenous structures.
Here are the working samples.
Here is the code based on pseudodependent types as shapeless.
The signature of the HMonoid
shows the zero
and the Semigroup
as expected:
1


This is just a sandbox to open discussion on this idea so I won’t explain more and let the curious ones think about it…
Have Monoids of Fun!