在 Haskell 中,我相信可以以编译器不允许别名类型和非别名类型之间的引用的方式对类型进行别名。根据这个堆栈溢出问题,可以newtype
像这样使用Haskell:
newtype Feet = Feet Double
newtype Cm = Cm Double
whereFeet
和Cm
的行为类似于 Double 值,但尝试将一个Feet
值与一个Cm
值相乘会导致编译器错误。
编辑:Ben 在评论中指出,Haskell 中的上述定义是不够的。Feet
并且Cm
将是新类型,在这些类型上不会定义任何函数。做了更多的研究,我发现以下方法会起作用:
newtype Feet = Feet Double deriving (Num)
newtype Cm = Cm Double deriving (Num)
这将创建一个从现有类型派生的新Num
类型(需要使用 switch: -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
newtype
假设它做了我认为它做的事情,Scala 是否有等价物?