Я хочу написать что-то вроде этого:
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 все в порядке.
Я хочу использовать тот же случай, чтобы избежать добавления уровня косвенности, например
type Exp =
| NumExpExp of NumExp
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
в определении Exp
.
Я чувствую, что упускаю что-то очень простое здесь.
Причина, по которой у меня есть NumExp
, заключается в том, что я хочу иметь возможность подключить 2 Exp
s к Dot
(а не к двум плавающим числам), потому что это облегчает генерацию выражений, но они не могут быть любой Exp
, просто числовой.
РЕДАКТИРОВАТЬ : что я действительно хотел знать, так это то, можно ли рассматривать два случая в двух DU как одну и ту же сущность (вроде как Exp
", включая" NumExp
). Теперь я понимаю, что Exp.Num
и NumExp.Num
- это совершенно разные сущности. Томас предлагает хороший способ различить два случая ниже.