2010-08-27 23 views
7

'da uygulamak Ocaml programcıları, tip sistemini kullanarak bazı kısıtlamaları uygulamak için 'fantom türleri' olarak adlandırılabilir. Güzel bir örnek http://ocaml.janestreet.com/?q=node/11 adresinde bulunabilir.Fantom türlerini F #

Sözdizimi type readonly, F # içinde çalışmaz. Yukarıda belirtilen blog gönderisinde hileleri uygulamak için type readonly = ReadOnlyDummyValue olarak tanımlanan sahte-hayalet tipiyle değiştirilebilir.

Fantom türlerini F # içinde tanımlamanın daha iyi bir yolu var mı?

+4

http://blog.matthewdoig.com/?p=134 ve http://blog.matthewdoig.com/?p=138 okudunuz mu? –

+0

Bağlantılar için teşekkürler. Bunları bir şekilde özledim. –

+1

matthewdoig adlı kullanıcının blogu öldü, ancak makaleler arşiv.org adresinde bulunuyor: http://web.archive.org/web/20100615031828/http://blog.matthewdoig.com/?p=134 http: //web.archive .org/web/20100615031841/http: //blog.matthewdoig.com/? p = 138 –

cevap

14

Sadece type somename kullanarak tanımlayan türün F # içinde çalışmayacağını düşünüyorum. F # derleyicisinin, bildiriden bazı .NET türlerini oluşturması gerekiyor ve F # belirtimi, fantom türleri için ne olması gerektiğini açıkça belirtmiyor.

Uygulama dosyasında (.fs) bir beton türü (ör. type somename = ReadOnlyDummyValue) oluşturabilir ve arabirim dosyasına (.fsi) yalnızca type somename ekleyerek türün içeriklerini gizleyebilirsiniz. Bu şekilde bir hayalet tipine oldukça yaklaşırsınız - dosyanın dışındaki kullanıcı türün iç kısımlarını görmez.

Arabirimleri başka bir çekici alternatif kullanmak olacaktır. Bu bana mantıklı geliyor, çünkü boş arayüz muhtemelen bildirebileceğiniz en basit tiptir (ve herhangi bir kukla tanımlayıcı sunmuyor). Sonra tip Ref<CanRead, int> değerlerini alabilir bir işlev yazabilirsiniz

type CanReadWrite = 
    inherit CanRead 
    inherit CanWrite 

:

type CanRead = interface end 
type CanWrote = interface end 

ilginç şey, bu durumda, siz de kalıtsal arayüzleri oluşturabileceğiniz anlamına gelir: Boş arayüz şöyle aynı zamanda (bu değerler de okuma desteklemek için) tip Ref<CanReadWrite, int> ait değerleri:

let foo (arg:Ref<#CanRead, int>) = // ...  

Bu u olabilir bir şey gibi görünüyor İçindek iler. Bunun OCaml'da da yapılıp yapılmayacağıyla ilgilenirim (çünkü arayüzler ve kalıtım için F # desteğine dayanır).

+0

Arayüz kullanımı önerisi harika. Teşekkürler! –

+0

@Tomas: Bu elbette, OCam'da da yapılabilir. –

+0

@Jon: Bunu bekliyordum. Hiç iyi bir bilgi kaynağı bulamadım ve bulamadım. Bazı örneklerin bağlantısı var mı (tercihen serbestçe kullanılabilir ;-))? –