Я новичок в 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 также невозможно, так как мне нужны разные типы параметров.
Мне интересно, как люди обычно решают проблему.
Заранее спасибо!