Это в 90х решено в Geant4 в том же духе, как в пакете quantitites@DUB выше. Вы просто пишете в одной системе единиц, вводя коэффициенты вроде mile и т.д. Я этим пользовался - очень удобно и ошибок нет, т.к. при забивке констант вы всё пишете с размерностью.
Вариант с отдельными типами пролетает потому, что физические размерности проносятся через алгебраические функции вроде pow/sqrt. То есть, вы должны написать такую статическую проверку размерностей, которая из
1m / pow( 1c, 2.0) сделает размерность ускорения.
Я совершенно не уверен, что это возможно на данном этапе развития языков программирования.
———————————————————
И основная проблема, с которой намучался я - это линейность записи формул в обычных ЯП. То есть, когда вы на бумажке легко пишете простое и понятное многоэтажное выражение, в переводе на C/Haskell/R/Python-куда-угодно получаем какую-то бессвязную ленту символов. Приходится придумывать совершенно искусственные обозначения для частей формулы.