Hi Christopher,
I made a small library to convert between strings and roman numerals [1]. It didn't use much abstraction. I mainly used some type-classes so multiple string-like types can be parsed.
The numerals themselves are basically a concatenation of value symbols. The order from high to low is not even strictly necessary in order to parse a roman numeral. One insight was to handle exceptions like "IV", "IX", "XL" etc. as separate symbols.
It would be interesting if you could parse roman numerals using a dedicated parsing library and come up with something shorter and/or more elegant/readable than my little library.