2009-08-04 36 views
12

Tôi đã trò chuyện với Sadek Drobi trên twitter khi được đưa ra rằng F # dường như không hỗ trợ các loại vô hạn. Nó chỉ ra rằng trong C# bạn có thể làm một cái gì đó dọc theo những dòng:Các loại vô hạn (hay còn gọi là loại đệ quy) không thể có trong F #?

delegate RecDelegate<T> RecDelegate<T>(T x); 

Tuy nhiên, sau một số thử nghiệm trên cả hai phần của chúng tôi, chúng tôi xác định rằng cùng trong F # dường như không thể cả hai ngầm và rõ ràng.

Explicit:

type 'a specialF = 'a->specialF<'a> 

lỗi FS0191: định nghĩa kiểu này liên quan đến một tài liệu tham khảo cyclic ngay qua viết tắt, struct lĩnh vực hoặc mối quan hệ thừa kế.

Ngầm định:

let rec specialF (x: 'a) = specialF 

Loại không phù hợp. Yêu cầu một 'b nhưng cho' a -> 'b. Kiểu kết quả sẽ là vô hạn khi hợp nhất '' b ' và' 'a ->' b '.

Tất nhiên, đây là những mẫu cố ý đơn giản.

Tôi đã tự hỏi liệu mình có nhầm lẫn hay không. Có lẽ tôi đã bỏ lỡ một số loại chú thích cần thiết?

+0

Có một ứng dụng thực tế ở đây hay là câu hỏi chỉ là kết quả của việc điều tra để giải trí? – Brian

+1

Theo như tôi hiểu, không có các ứng dụng minh bạch tham chiếu thực tế. Tuy nhiên, một ví dụ sẽ là với một số loại trạng thái có thể thay đổi được đóng lại, điều này có thể hữu ích cho các ứng dụng lặp lại. ví dụ: thêm (1) (2) (3) (4) - nơi có thể thực hiện bất kỳ số lượng ứng dụng nào. –

+0

Đây là chương trình OCaml mà tôi đã viết sử dụng tính năng này để tránh mức độ gián đoạn bằng cách sử dụng rectypes. http://www.ffconsultancy.com/languages/ray_tracer/code/1/ray.ml –

Trả lời

7

Bạn cũng có thể làm điều gì đó như

type 'a RecType = RecType of ('a -> 'a RecType) 

để tạo ra một loại tên là thông qua đó để thực hiện đệ quy. Bây giờ công trình này:

let rec specialF = RecType (fun _ -> specialF) 
+0

Tôi cũng sẽ quan tâm nếu phiên bản tổng quát hơn hoạt động: http://stackoverflow.com/questions/1253374/explicit-type -người tham gia –

6
type d<'T> = delegate of 'T -> d<'T> //' 
let del : d<int> = null 
let anotherDel = del.Invoke(1).Invoke(2).Invoke(3) 

Tôi nghĩ bạn cần loại được đặt tên trực tiếp trong CLI để ngắt đệ quy, vì vậy trong F # điều này có nghĩa là bạn cũng cần loại đại biểu thực sự.

3

Loại bản ghi đệ quy cũng sẽ hoạt động.

type A = { A : A } 
let rec a : A = { A = a } 

Tôi muốn được quan tâm đến một ứng dụng thực tế. Hoặc thậm chí là không thực tế :)

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