have equivalent dimensions, so you can use .+. or .-. on them. And you can also use coerce to go from one unit to an equivalent one:

*Main>coerce((1gram/second)*second)gram1.0g

However, units are treated very stupidly compared to dimensions, so this conversion is not (yet?) automatic.

I'm still thinking about how to tackle this problem.

I could use the same type-level mechanism that is applied to dimensions and apply that to units, meaning I represent every unit as a type-level map of base units to integer powers, like Meter^1 Second^-2. That will at least remove the obvious redundancies like 1.0 g/s⋅s.

However, that will not do anything for (1 gram / hour) * second, as hour and minute are not the same unit.

An other approach would be to have a function with takes a value, looks only at its dimension, and determines a "canonical unit" for it. So for length it woud always pick meter, and for time always second, so for 1.0 g/s⋅s it would pick gram, and then coerce to it.