Tôi muốn viết một cái gì đó như thế này:trường hợp chung trong F # phân biệt đối xử đoàn
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
Trình biên dịch phàn nàn về một cuộc xung đột giữa NumExp
và Exp
trong getValue
. Thậm chí sau thất bại:
let getValue (nn : NumExp) = match nn with | Num(n) -> n
Có cách nào để sử dụng các trường hợp tương tự trong cả hai công đoàn phân biệt đối xử làm việc với chức năng? Bản thân định nghĩa DU là OK.
Tôi muốn sử dụng các trường hợp tương tự để tránh thêm một mức gián tiếp như
type Exp =
| NumExpExp of NumExp
| Dot of NumExp * NumExp
| Op of string * Exp * Exp
trong định nghĩa Exp
. Tôi cảm thấy tôi đang thiếu một cái gì đó rất cơ bản ở đây.
Lý do tôi có NumExp
là tôi muốn để có thể 'cắm' 2 Exp
s vào một Dot
(chứ không phải 2 phao) bởi vì nó làm cho việc tạo ra biểu thức dễ dàng hơn, nhưng họ không thể có bất kỳ Exp
, chỉ số .
EDIT: những gì tôi thực sự muốn biết là liệu hai trường hợp trong hai dus có thể được coi như cùng một thực thể (loại giống như Exp
"bao gồm" NumExp
). Tôi nhận ra bây giờ Exp.Num
và NumExp.Num
là các thực thể hoàn toàn riêng biệt. Tomas cung cấp một cách phân biệt rõ ràng hai trường hợp dưới đây.
Cảm ơn Tomas, công trình định hướng kỳ diệu. Những gì tôi đã yêu cầu, mặc dù là giống như 'có thể hai trường hợp trong hai DU được coi là cùng một thực thể?', Hoặc nói cách khác, 'có thể Exp "bao gồm" NumExp?'. Nhưng từ câu trả lời của bạn, câu trả lời là không. Cảm ơn! – Mau
@Mau: Tôi đã thêm một số thông tin về việc chia sẻ các trường hợp giữa các công đoàn bị phân biệt đối xử khác nhau. Nó không phải là có thể, nhưng bạn có thể bao gồm một trong khác. –
cảm ơn, đó là chính xác những gì tôi đã làm :-) – Mau