Совместные дела в 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
являются совершенно отдельными объектами. Томас обеспечивает хороший способ различения двух случаев ниже.