Я хочу написать что-то вроде этого:
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 к Dot (а не к 2 поплавкам), поскольку упрощает генерации выражений, но они не могут быть Exp, просто числовое.
EDIT: я действительно хотел знать, могут ли два случая в двух DU рассматриваться как одна и та же сущность (например, Exp ", включая" NumExp). Теперь я понимаю, что Exp.Num и NumExp.Num являются полностью отдельными объектами. Tomas обеспечивает хороший способ распознавания двух случаев ниже.