私はこのようなものを書きたいです:
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に「プラグイン」できるようにしたいからです。ExpDotExp
編集:私が本当に知りたかったのは、2つのDUの2つのケースを同じエンティティ(Exp「含む」のようなものNumExp)として扱うことができるかどうかです。私は今気づきExp.Num、NumExp.Num完全に別の存在です。Tomasは、以下の2つのケースを区別するための優れた方法を提供します。