я хочу написать что-то вроде этого:Общие случаи в 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
, что я хочу, чтобы иметь возможность «штекер» 2 Exp
s в Dot
(а не 2 поплавков), потому что это делает генерацию выражения проще, но они не могут быть любой Exp
, просто числовой ,
EDIT: то, что я действительно хотел бы знать, является ли эти два случая в двух ПН можно рассматривать как тот же объект (вроде как Exp
«включая» NumExp
). Я понимаю, что Exp.Num
и NumExp.Num
являются полностью отдельными объектами. Томас обеспечивает хороший способ различать два случая ниже.
Спасибо Томасу, знаменательные работы творят чудеса. То, о чем я спрашивал, скорее всего было «можно ли рассматривать два случая в двух DU как одну и ту же сущность?», Или, другими словами, «может Exp» включать «NumExp?». Но из вашего ответа ответ отрицательный. Благодаря! – Mau
@Mau: Я добавил некоторую информацию о совместном использовании случаев между различными дискриминационными союзами. Это невозможно, но вы можете включить его в другое. –
спасибо, это именно то, что я сделал :-) – Mau