Я хочу написать что-то вроде этого:
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 обеспечивает хороший способ распознавания двух случаев ниже.