Haskell では、コンパイラがエイリアスされた型とエイリアスされていない型の間の参照を許可しないような方法で型をエイリアスすることが可能であると私は信じています。このスタック オーバーフローの質問によれば、Haskell のnewtypeように使用できます。
newtype Feet = Feet Double
newtype Cm = Cm Double
whereFeetとは Double 値のように動作しますが、値と値Cmを乗算しようとすると、コンパイラ エラーが発生します。FeetCm
編集: ベンはコメントで、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には同等のものがありますか?