2013-03-22 8 views
5

, Hashtbl bir intOCaml'de val hash: 'a -> int` nasıl uygulandı? OCaml olarak

Hashtbl.hash X için herhangi bir şey hash herhangi bir türdeki herhangi bir değere negatif olmayan bir tamsayıyı ilişkilendirir. X = y veya Pervasives.compare x y = 0 ise hash x = hash y olması garanti edilir. Ayrıca, karma her zaman döngüsel yapılarda bile sona erer. Java yılında

Yani, biz bir tamsayı döndürür ve Java'nın Hashtable'a o tamsayı karma gelen her nesne için hashCode() var.

Fakat OCaml bunu bir şeye nasıl getirdi?

cevap

6

Bu zor değil. Hashtbl.hash sadece çöp toplayıcının yaptığı gibi bir veriyi aktarır. Döngüsel yapıya sabit bir mesafe kat eder, bu da döngü olduğunda arızalanmayı önler. Karşılaştığı üst düzey tipler hakkında hiçbir şey bilmiyor, sadece ulaştığı ilkel değerleri taşıyor.

OCaml kaynak dağıtımında kodu byterun/hash.c'de görebilirsiniz.

Güncelleme

Size Hashtbl.hash OCaml yılında nasıl uygulandığına soran olabilir aklıma. Cevap, OCaml'da (hile yapmadan) uygulanamayacağından, parametrikliği ihlal ettiği içindir. 'a -> int türünün tek olası saf işlevleri, sabit bir değer döndüren işlevlerdir. Sezgi, böyle bir işlevin argüman hakkında herhangi bir bilgiyi kullanamamasıdır çünkü tüm olası tipler için tanımlanmıştır. Parametre değerini ihlal eden birkaç OCaml işlevinden biridir. OCaml'da varlar çünkü son derece kullanışlılar. Diğer bir isim ise, compare (ve ilgili = operatörünün) polimorfik karşılaştırmasıdır.

+2

Teşekkürler, sadece hash.c linkini ekledim: https://github.com/OCamlPro/ocp-ocaml/blob/master/byterun/hash.c –

+0

Jeffrey, lütfen söyler misiniz Bir tamsayı 0 ile M-1 arasında eşleştirecekler, neden normalde M'yi Prime veya Power of 2 olarak seçiyoruz? –

+1

Prime: değerleri daha iyi yayar (her şey nispeten önceliklidir). Güç 2: Maskeleme ile hesaplamak kolay. –

İlgili konular