2009-05-11 24 views
6

Tôi đã xem xong sách của mình và tôi đã googled cho đến khi tôi hết các cụm từ tìm kiếm, nhưng tôi vẫn không thể tìm thấy ví dụ hoặc câu trả lời cho vấn đề này:Làm cách nào để giải quyết lỗi tham chiếu loại F #?

Mã sau không biên dịch vì kiểu Effect và kiểu Affect chưa được khai báo tại thời điểm Entity được khai báo. Vì vậy, những gì tôi không hiểu là làm thế nào để làm việc xung quanh điều này.

Trong C++, sự cố này được giải quyết thông qua khai báo mẫu trong tệp h và sau đó bao gồm tệp h. Trong C# nó không bao giờ là một vấn đề. Vậy làm thế nào nó được giải quyết trong F #?

#light 
type Entity = 
    { 
     Name:string; 
     Affects:List<Affect>; //Compile error: The type Affect is not defined 
     Effects:List<Effect>; //Compile error: the type Effect is not defined 
    } 

type Effect = 
    { 
     Name:string; 
     //A function pointer for a method that takes an Entity and returns an Entity 
     ApplyEffect:Entity -> Entity; 
    } 

type Affect = 
    { 
     Name:string; 
     //A List of Effects that are applied by this Affect Object 
     EffectList:List<Effect>; 
     //A function pointer to return an Entity modified by the listed Effects 
     ApplyAffect:Entity->Entity; 
    } 

Mục tiêu cơ bản ở đây là một đối tượng thuộc loại Thực thể có thể liệt kê Ảnh hưởng có thể áp dụng cho đối tượng thuộc đối tượng loại. Thực thể cũng có thể liệt kê các Hiệu ứng đã được áp dụng cho nó. Bằng cách này, trạng thái "hiện tại" của một thực thể được tìm thấy bằng cách gấp tất cả các hiệu ứng đối với trạng thái thực thể ban đầu.

Cảm ơn bạn đã dành thời gian,

--Adam Lenda

+0

Xem cũng http://stackoverflow.com/questions/680606/f-how-to-have-two-methods-calling-each-other wh ich cho thấy cách xác định các hàm đệ quy lẫn nhau cũng như các kiểu đệ quy lẫn nhau. – Brian

Trả lời

13

Tôi tin rằng đây là câu trả lời đúng:

http://langexplr.blogspot.com/2008/02/defining-mutually-recursive-classes-in.html

như vậy ...

type Entity = 
    { 
     Name:string; 
     Affects:List<Affect>; 
     Effects:List<Effect>; 
    } 
and Effect = 
    { 
     Name:string; 
     ApplyEffect:Entity -> Entity; 
    } 
and Affect = 
    { 
     Name:string; 
     EffectList:List<Effect>; 
     ApplyAffect:Entity->Entity; 
    } 
+0

Yup - đó chỉ là những gì tôi sắp đăng, bây giờ tôi đã tìm thấy nó. Chương 8 trong "Lập trình chức năng cho thế giới thực" :) –

+0

chương 3, trang 67 của 'chuyên gia f #' –

+0

Hrmm ... Tôi sắp đăng cùng một điều, nhưng kết luận là không thể sau khi nhận được lỗi trình biên dịch ! Hóa ra tôi chỉ có cú pháp hơi sai. – Noldorin

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