2011-01-20 18 views
9

OCaml karşılıklı özyinelemeli modül tanımları kullanırken, hatta .ml dosyada, imzaları vermek gereklidir. Bu benim de iki kez imza tekrarlayarak sona kadar, .mli, belirli bir arabirim göstermesini istediğiniz bir sıkıntıdır. :(!OCaml'deki karşılıklı özyinelemeli modüllerdeki imza gereksinimi neden?

module rec Client : sig 
    type ('serv,'cli) t 

    (* functions ... *) 
end = struct 
    type ('serv,'cli) t = 
    { server: ('serv,'cli) Server.t 
    ; (* other members ... *) 
    } 
end 
and Server : sig 
    type ('serv,'cli) t 

    (* functions ... *) 
end = struct 
    type ('serv,'cli) t = 
    { mutable clients: ('serv,'cli) Client.t list 
    ; mutable state: 'serv 
    } 

    (* functions again ... *) 
end 

Bu ne yapıyorum kaba bir tahmindir (Client tip nesneler onları örneği Server biliyorum. Server ler kendi Client s biliyorum). Elbette

, imzalar vardır . .mli tekrarlanan neden gereklidir

(Not:. Ben şikayetçi değilim, ama aslında bir tip-teori ya da "sert derleyici sorunu" Bunun lı sebebi varsa bilmek istiyorum)?

cevap

4

Benim tahminim: özyinelemeli modüller derleyici derlemek amacıyla uygulamaya üzere tür ek ihtiyacı vardır. mli dosyasında derleyici tip-özyinelemeye çözme mli wrt yararlı türlerini bulmak için beklemek için mantıklı değildir, genel durumda böylece bu modüllerin tipleri, ayrıca kısıtlı veya tamamen gizli olabilir (eğer herhangi kullanıyorsanız). bağlantıdan

+0

Bu mantıklı. Gerçekten de, ".mli" deki dış tüketiciler için farklı bir tür imzasını ortaya çıkararak bu "özellikten" yararlanıyorum; Fark etmeliydim. – Ashe

+1

İyi tahmin. Tip ek açıklamaları gereklidir, çünkü karşılıklı olarak özyinelemeli modüller ve fiderler durumunda çıkarım genel olarak kabul edilemez. Literatür, minimum ek açıklama gerekliliklerini optimize etmek ve sağlamlığı korumak için tip sistemleri iyileştirme girişimleri ile doludur. OCaml'ın tip sisteminin, ek açıklama zorunluluğunu azaltmak için geliştirilip geliştirilemeyeceği tartışmalıdır. –

7

Bildiğim kadarıyla bunun etrafında bir yol yok. Çok yüksek bir seviyede, derleyici söz konusu olduğunda, İstemcinin tip imzası, Sunucu'nun tip imzasını bilene kadar tam tersi değildir ve tersi de geçerlidir. Prensip olarak, bunun etrafında bir yol var: derleyici, derleme zamanında .mli dosyalarınızı çapraz referans olabilir. Ancak bu yaklaşımın dezavantajları vardır: derleyicinin ve linker'ın bazı sorumluluklarını karıştırır ve modüler derlemeyi (punto içermez) daha zor hale getirir. İlginizi çekiyorsa

, ben tavsiye Xavier Leroy original proposal özyinelemeli modülleri için.

+0

teşekkürler! Tip teorisi benden biraz daha fazla, ama yine de iyi bir okuma. Ama sanırım, bahsettiğim gibi, asıl modülün kendisini derlerken kullanılan türü bildirmek için .mli için değil. Bahsettiğin gibi, daha da çirkin yapardı, eğer yapmaya çalıştıysa. – Ashe