Я новичок в 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)
поэтому в любое время, когда я пытаюсь использовать неправильные единицы измерения в моих формулах, компилятор кусает.
Проблема заключается в том, что я не могу реализовать ad-hoc-полиморфизм следующим образом. С помощью этого кода я привожу двусмысленность - компилятор может отличить мой оператор * и тот, который определен в Prelude. Объявление экземпляра класса Num также невозможно, так как мне нужны разные типы параметров.
Мне интересно, как люди обычно решают проблему.
Спасибо заранее!