OCMde

2013-03-10 6 views
9

'da kullanıcı tanımlı bir tür olarak hashtable tanımlanması Hatalı dizeleri anahtarlarla ve tamsayı değerleriyle eşleştirilebilen bir tür (my_type) tanımlamak istiyorum. Geçen çizgi gösterileri (dize, int) Hashtbl.t = Kurultay özet yerine my_type aitOCMde

# let a = Hashtbl.create 100;; 
val a : ('_a, '_b) Hashtbl.t = <abstr> 
# Hashtbl.add a "A" 12;; 
- : unit =() 
# a;; 
- : (string, int) Hashtbl.t = <abstr> 

çalıştığınızda
Yani, ben

# type my_type = (string, int) Hashtbl.t;; 

çalıştı Ama. My_type olarak bana hashtable'ın türünü verdiğinden nasıl emin olabilirim?

cevap

1

my_type sadece (string, int) Hashtbl.t eşanlamlısı, ikisi de birbirinin yerine kullanabilirsiniz.

Sen, bu şekilde tip my_type taşımaktadır a derleyici anlatacağım ve daha güzel çıktı alabilirsiniz: yaklaşık <abstr> merak ediyorsanız

# let (a:my_type) = Hashtbl.create 100;; 
val a : my_type = <abstr> 
# a;; 
- : my_type = <abstr> 

, bu toplevel bilmiyor demektir nasıl yazdır a (içeriği değil, içeriği).

2

Güncelleme: Gasche işaret ettiği gibi üzgünüm, bunu yapmak için basit bir tipi notunu kullanabilir, Duygusuzlaştırıyor tipi eş anlamlılarını ilan etmek ve derleyici beklemek yapar

# type my_type = (string, int) Hashtbl.t;; 
type my_type = (string, int) Hashtbl.t 
# let (a : my_type) = Hashtbl.create 100;; 
val a : my_type = <abstr> 
+1

Bu çok iyi bir öneri değildir: burada alt türlemeyle ilgili değil, yalnızca iki tür eşittir. Basit bir ek açıklama yapacağı için, cisimler çok anlam ifade etmemektedir ve aslında bir tür ek açıklama bile az bir kullanımdır. – gasche

+0

Haklısın, yazı tipi ekini unutmuşum .. Bu gerçekten iyi bir tavsiye değil .. – octref

9

tip zorlama unutun Bir ifadeyi ya da diğerini kesin durumlarda kullanın: Eşit tür olduklarından, derleyici birini kullanır ve bunun üzerinde çok az kontrole sahip olursunuz. (

type my_type = Tbl of (string, int) Hashtbl.t 
let a = Tbl (Hashtbl.create 100) 
let add (Tbl t) k v = Hashtbl.add t k v 

Bunu isteyebilirsiniz: Başka (string, int) Hashtbl.t ile bir tür my_type karışmaz şekilde yazın soyutlama zorlamak istiyorsanız

, farkı münasebetiyle kurucu ile yeni bir tür tanımlamak gerekir my_type'un tüm değerlerini Hashtbl işlevlerinden birini kullanmak istediğinizde açık desen eşleştirmesiyle dönüştürmek zorunda kalma maliyetini ödeyebilirsiniz veya yalnızca bir eşanlamlılık türünü değiştirmek isteyebilirsiniz, ancak ikinci durumda Derleyici çıktısını herhangi bir tür bildirmek için bekler.

+1

OCaml 3.11'den itibaren, çalışma zamanı yükü olmadan yeni bir tip almak için "özel tip kısaltmalar" kullanabilirsiniz (bunu asla kendim kontrol etmedim). Bunun için 'my_type = private (string, int) Hashtbl.t' yazın. Tanımlama modülünün içinde 'my_type' sade bir kısaltmadır. Ancak dışarıda, açık dönüşüm işlevlerine ihtiyacınız var. Bir yön için de, örneğin 't:> (string, int) Hashtbl.t',' my_type 'türünde bir tif tablosuna' t 'zorlamak için çalışır. – chris

+0

@chris: Fakat bu, dönüşümün yalnızca bir tarafına sahip olduğunuz bir modül soyutlaması olduğunu varsayalım. Burada ihtiyaç duyulan şey, her iki * dönüşüm yönüne izin veren, ancak "özel" ifadesinin her zamanki eşanlamlılarla karşılaştırıldığı gibi, açık bir şekilde uygulanmasını sağlayan "opak tip bir kısaltmadır". – gasche