2010-07-22 48 views
14

Tôi đang xây dựng một cây biểu hiện bằng cách sử dụng các công đoàn phân biệt đối xử. Mã bên dưới:Các công đoàn có thể phân biệt đối xử có liên quan đến nhau không?

type IntExpression = 
    | TrueIsOne of BoolExpression 

type BoolExpression = 
    | LessThan of IntExpression * IntExpression 
    | And of BoolExpression * BoolExpression 
    | Or of BoolExpression * BoolExpression 
    | Bool of bool 

ném lỗi vì BoolExpression không được xác định. Trao đổi các định nghĩa chỉ là kết quả ngược lại (IntExpression không được định nghĩa) như bạn mong đợi.

Có cách nào khác không?

+0

thể trùng lặp của [F # tờ khai chuyển tiếp loại] (http://stackoverflow.com/questions/1378575/f-forward-type-declarations) – Brian

+0

@ Brian Đây là cùng một câu hỏi, nhưng thuật ngữ khác đủ để tôi không tìm thấy nó với Google hoặc tìm kiếm trang web. Điều đó một mình có thể là một lý do để để cả hai mở. – mavnn

Trả lời

23

Có, sử dụng and vào nhóm định nghĩa kiểu với liên phụ thuộc:

type IntExpression = 
    | TrueIsOne of BoolExpression 

and BoolExpression = 
    | LessThan of IntExpression * IntExpression 
    | And of BoolExpression * BoolExpression 
    | Or of BoolExpression * BoolExpression 
    | Bool of bool 
4

Có lẽ điều này sẽ làm việc:

type IntExpression = 
    ... 
and BoolExpression = 
    ... 

(Thông tin lấy từ this page on MSDN.)

9

"và" hoạt động thường cho các loại có phụ thuộc lẫn nhau. Nghĩa là, nó hoạt động cho tất cả các loại, chẳng hạn như các công đoàn phân biệt đối xử, như được hiển thị bởi Mau, các lớp, các bản ghi và các hàm đệ quy lẫn nhau.

không chấm dứt dụ:

let rec foo x = bar x 
and bar x = foo x 
+1

+1 cho ngữ cảnh bổ sung –

Các vấn đề liên quan