2012-01-30 32 views
7

Tôi biết rằng có thể xác định các mô-đun đệ quy, có ai biết cách xác định chữ ký đệ quy không? Ví dụ: tôi muốn nhận ra:Xác định chữ ký đệ quy cho các mô-đun

module type AAA = sig 
    module Bbb : BBB 
    type 'a t 
    val f : 'a Bbb.t -> 'a t 
end 

module type BBB = sig 
    module Aaa : AAA 
    type 'a t 
    val g : 'a Aaa.t -> 'a t 
end 

Có ai giúp được không?

Trả lời

6

Bạn không có thể, như xa như tôi có thể nói. Các giải pháp gần nhất là để hạn chế các bit "đệ quy" với những gì là thực sự cần thiết để thể hiện mỗi chữ ký riêng:

module type AA = 
sig 
    module B : sig type t end 
    type t 
    val f : unit -> B.t 
end 

module type BB = 
sig 
    module A : sig type t end 
    type t 
    val g : unit -> A.t 
end 

Và sau đó tinh chỉnh khi bạn xác định các module:

module rec A : AA with module B = B = 
struct 
    module B = B 
    type t = int 
    let f() = B.g() 
end 
and B : BB with module A = A = 
struct 
    module A = A 
    type t = int 
    let g() = A.f() 
end 

FWIW, người ta có thể nghĩ rằng chúng ta có thể bày tỏ chữ ký đệ quy (với nhiều sự lặp lại) bằng cách sử dụng các module đệ quy:

module rec AA : 
sig 
    module type T = sig module B : BB.T end 
end = 
struct 
    module type T = sig module B : BB.T end 
end 
and BB : 
sig 
    module type T = sig module A : AA.T end 
end = 
struct 
    module type T = sig module A : AA.T end 
end 

Tuy nhiên, điều đó không làm việc:

Error: Unbound module type BB.T 
+0

Cảm ơn bạn câu trả lời ... 'giải pháp gần nhất là để hạn chế các" đệ quy "bit' ==> Bạn có thể vui lòng giải thích thêm về các giới hạn của giải pháp của bạn? – SoftTimur

+1

Vâng, điều này không cho phép bạn thể hiện sự đệ quy tùy ý giữa các chữ ký, bởi vì bạn cần có khả năng cô lập một tập hợp con độc lập của từng chữ ký như một loại khai báo chuyển tiếp. Ngoài ra, bạn đang lặp lại từng tập con trong hai vị trí đó - nhưng việc đặt tên và 'bao gồm' chúng có thể trợ giúp ở đó. Trong trả lời của tôi, tôi không bận tâm để làm điều đó, bởi vì các tập hợp con có liên quan (loại t) là đủ nhỏ. –

4

Bạn có thể viết một cái gì đó như thế:

module rec Aaa : sig 
    type 'a t 
    val f : 'a Bbb.t -> 'a t 
end = Aaa 
and Bbb : sig 
    type 'a t 
    val g : 'a Aaa.t -> 'a t 
end = Bbb 
+0

Cảm ơn nhận xét của bạn, nhưng tôi thực sự muốn đặt tên cho chữ ký, ví dụ: 'AAA' aor' BBB' ... bạn không đề cập đến câu trả lời của bạn ... – SoftTimur

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