Совместные дела в F # дискриминационных союзах

Я хочу написать что-то вроде этого:

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

РЕДАКТИРОВАТЬ: что я действительно хотел знать, так это то, могут ли два случая в двух DU рассматриваться как один и тот же объект (вроде какExp "в том числе"NumExp). Теперь я понимаюExp.Num а такжеNumExp.Num являются совершенно отдельными объектами. Томас обеспечивает хороший способ различения двух случаев ниже.

Ответы на вопрос(4)

Ваш ответ на вопрос