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