私はこのようなものを書きたいです:
type NumExp = Num of float
type Exp =
| Num of float
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
let getValue (Num(n) : NumExp) = n
NumExp
コンパイラは、とExp
の間の競合について文句を言いgetValue
ます。次の場合でも失敗します。
let getValue (nn : NumExp) = match nn with | Num(n) -> n
関数で動作する両方の識別された共用体で同じケースを使用する方法はありますか?DU定義自体はOKです。
同じケースを使用して、次のような間接参照のレベルを追加しないようにします
type Exp =
| NumExpExp of NumExp
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
Exp
定義で。ここでは非常に基本的なものが欠けているように感じます。
私が持っている理由は、式の生成を容易にするため、2を(2つのフロートではなく)NumExp
に「プラグイン」できるようにしたいからです。Exp
Dot
Exp
編集:私が本当に知りたかったのは、2つのDUの2つのケースを同じエンティティ(Exp
「含む」のようなものNumExp
)として扱うことができるかどうかです。私は今気づきExp.Num
、NumExp.Num
完全に別の存在です。Tomasは、以下の2つのケースを区別するための優れた方法を提供します。