умножение разных типов в Haskell

Я новичок в haskell, и время от времени натыкаюсь на проблему, которую я ' Попробую описать здесь в двух словах. Представьте себе, я хочу объявить разные типы для разных мер, чтобы система типов Haskell находила ошибки в моих формулах:

newtype Dist = Km Float
newtype Time = H Float
newtype Velocity = KmH Float

(/) :: Dist → Time → Velocity
(Km d) / (H t) = KmH (d / v)

(*) :: Velocity → Time → Dist
(KmH v) * (H t) = Km (v * t)

так что каждый раз, когда я пытаюсь использовать неправильные единицы измерения в своих формулах, компилятор будет кусаться.

проблема в том, что я не могу реализовать такой специальный полиморфизм. С помощью этого кода я привносю двусмысленность - компилятор может отличить мой оператор * от оператора, определенного в Prelude. Объявление экземпляра класса Num также невозможно, так как мне нужны разные типы параметров.

Мне интересно, как люди обычно решают проблему.

Заранее спасибо!

10
задан Maxym 15 March 2011 в 20:25
поделиться