В Haskell я считаю, что можно использовать псевдоним типа таким образом, чтобы компилятор не разрешал ссылки между псевдонимом и неустановленным типом. Согласно этому вопросу, можно использовать Haskell newtype
следующим образом:
newtype Feet = Feet Double
newtype Cm = Cm Double
где Feet
и Cm
будут вести себя как двойные значения, но попытка умножить значение Feet
и значение Cm
приведет к ошибке компилятора.
EDIT: Бен отметил в комментариях, что этого выше определения в Haskell недостаточно. Feet
и Cm
будут новые типы, на которых не будет определено никаких функций. Сделав еще несколько исследований, я обнаружил, что будут работать следующие:
newtype Feet = Feet Double deriving (Num)
newtype Cm = Cm Double deriving (Num)
Это создает новый тип, который происходит из существующего типа Num
(требуется использовать переключатель: -XGeneralizedNewtypeDeriving
). Конечно, эти новые типы будут еще более ценными из других типов, таких как Show
, Eq
и т.д., Но это минимум, необходимый для правильной оценки Cm 7 * Cm 9
.
Оба Haskell и Scala имеют type
, который просто псевдонизирует существующий тип и допускает бессмысленный код, такой как этот пример, в Scala:
type Feet = Double
type Cm = Double
val widthInFeet: Feet = 1.0
val widthInCm: Cm = 30.48
val nonsense = widthInFeet * widthInCm
def getWidthInFeet: Feet = widthInCm
Имеет ли Scala эквивалент newtype
, предполагая, что это делает то, что я думаю, что он делает?