chcę napisać coś takiego:Udostępnione przypadki w F # dyskryminowane związków
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
Kompilator narzeka konfliktu między NumExp
i Exp
w getValue
. Nawet nie następuje:
let getValue (nn : NumExp) = match nn with | Num(n) -> n
Czy istnieje sposób, aby korzystać z tej samej sprawy w obu dyskryminowanych związków, które współpracuje z funkcji? Definicje dalszych użytkowników są w porządku.
chcę używać tej samej sprawy, aby uniknąć dodawania poziom zadnie jak
type Exp =
| NumExpExp of NumExp
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
w definicji Exp
. Czuję, że brakuje tu czegoś bardzo prostego.
Powodem Mam NumExp
jest, że chcę, aby móc „wtyczki” 2 Exp
S w Dot
(zamiast 2 pływaki), ponieważ to sprawia, że generowanie wyrażenia łatwiejsze, ale nie mogą one być dowolny Exp
tylko numeryczna .
EDIT: co naprawdę chciałem wiedzieć, czy te dwa przypadki w dwóch dalszych użytkowników mogą być traktowane jako ten sam podmiot (niby jak Exp
„w tym” NumExp
). Zdaję sobie teraz sprawę, że Exp.Num
i NumExp.Num
są całkowicie oddzielnymi jednostkami. Tomas stanowi dobry sposób na rozróżnienie dwóch przypadków poniżej.
Dzięki Tomas, ujednoznacznienie działa cuda. To, o co pytałem, brzmiało raczej "czy te dwie sprawy w dwóch dalszych użytkownikach można traktować jako tę samą jednostkę?", Czy też innymi słowy, "czy exp" może zawierać "NumExp?". Ale z twojej odpowiedzi odpowiedź brzmi: nie. Dzięki! – Mau
@Mau: Dodałem kilka informacji o udostępnianiu spraw między różnymi dyskryminowanymi związkami. Nie jest to możliwe, ale możesz dołączyć jeden do drugiego. –
dziękuję, właśnie to zrobiłem :-) – Mau