Мне нравится идея синонимов типов Haskell, потому что они позволяют различать абстрактные типы данных, которые имеют общие базовые представления. К сожалению, когда я пишу программу типа
data Vector a = Vec a a
-- Some definitions here about (+) and (*) for Vector ...
type Position = Vector Float
type Velocity = Vector Float
type Time = Float
step :: Position -> Velocity -> Time -> Position
step p v dt = p + v*dt
p :: Position
p = Vec 0.0 0.0
v :: Velocity
v = Vec 1.0 1.0
p' = step v p 0.01
Это совершенно правильный код на Haskell, несмотря на то, что v
и p
находятся не в тех местах. Я хотел бы усилить различие между синонимами типов, чтобы они по-прежнему имели общее базовое представление, но не принимались друг за друга в приложении функции. Это возможно?
newtype
вместо lftype
. - person Shersh   schedule 05.03.20185+
плюсами иначе невозможно... Политика StackOverflow поощряет меня писать такие комментарии вместо ответов! - person Shersh   schedule 05.03.2018newtype Vector a = Vector (a, a)
. - person Austin Garrett   schedule 07.03.2018