1 つの関数で異なるレコード タイプから同じラベルを呼び出すことは可能ですか? たとえば、以下に定義されている 2 つのレコードがあるとします。
type Pen = {
Diameter: float
InkColor: string
}
type Pencil = {
Diameter: float
Hardness: int
Blackness: int
}
いずれかのレコード タイプから Diameter ラベルにアクセスする関数を作成できますか? 現在、ペンと鉛筆を定義すると、コンパイラはどのレコード タイプを使用するかで混乱します。問題は、コンパイラに型を選択させたくないということです。コンパイラが何かを選択した場合、両方の型の使用を許可します。この例は鉛筆を想定しているため、コンパイルされません。
let black_pen = {
Diameter = 0.7
InkColor = "Black"
}
let mechanical_pencil = {
Diameter = 0.5
Hardness = 1
Blackness = 2
}
let getDiameter writing_utility =
let {Diameter = dia} = writing_utility
dia
printf "%A" (getDiameter black_pen)
私が今見ている唯一のオプションは次のとおりです。
- レコードを列挙型と組み合わせて、どれがどのオブジェクトであるかを示します。続いてパターンマッチ
- 代わりにクラスを使用して継承を使用する
- 動的な型とリフレクションを使用して、ラベルと型を確認します
次のようなものにジェネリックを使用できればいいのですが。
let getDiameter writing_utility =
let {Diameter<float> = dia} = writing_utility
dia
これは、レコードに「Diameter」というラベルがあり、フロートである限り、値を返します。