Dominic: make it work with strings (and any defined semigroup)
Dominic: remove implicit parameters so that applies can be chained