In Haskell, I believe that it is possible to alias a type in such a way that the compiler does not allow references between the aliased type and the unaliased type. According to this stack overflow question, one can use Haskell's newtype
like so:
newtype Feet = Feet Double
newtype Cm = Cm Double
where Feet
and Cm
will behave like Double values, but attempting to multiply a Feet
value and a Cm
value will result in a compiler error.
EDIT: Ben pointed out in the comments that this above definition in Haskell is insufficient. Feet
and Cm
will be new types, on which there will be no functions defined. Doing a bit more research, I found that the following will work:
newtype Feet = Feet Double deriving (Num)
newtype Cm = Cm Double deriving (Num)
This creates a new type that derives from the existing Num
type (requires using switch: -XGeneralizedNewtypeDeriving
). Of course, these new types will be even more valuable deriving from other types such as Show
, Eq
, etc. but this is the minimum required to correctly evaluate Cm 7 * Cm 9
.
Both Haskell and Scala have type
, which simply aliases an existing type and allows nonsensical code such as this example in 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
Does Scala have a newtype
equivalent, assuming that this does what I think it does?