2012-05-08 32 views
5

OCaml'ın aşırı yüklemeyi desteklemediğini biliyorum. Ardından, aşırı yükleme yerine, bu konuda çalışmak için ne yapabiliriz? 1) yerine polimorfizm kullanın? 2) farklı işlevler farklı adlar vermek? 3) Aynı ismin fonksiyonlarını farklı modüllere yerleştirmek?Ocaml'de Aşırı yükleme

Hangisi çalışır?

cevap

13

Her şey aşırı yükleme nedeniyle ne demek istediğinize bağlıdır. Aşağıdaki gibi birkaç kullanım durumu vardır:

Her zamanki infix operatörleri adını tamsayılardan başka bir şeyi manipüle eden matematiksel bir ifadede kullanmak isterseniz: operatörlerinizi yerel olarak yeniden yönlendirin; modüller ve "yerel açık" bu konuda yardımcı olabilir. Eğer bir operasyon kullanılan sayısal tür tipinde polimorfik olmasını istiyorsanız

module I32 = struct 
    open Int32 
    let (+), (-), (*), (/), (!!) = add, sub, mul, div, of_int 
end 

... I32.(x + y * !!2) ... 

, bu tür sayısal operatörler üzerinde soyut gerekir. Örneğin (bir tamsayı olarak) jenerik hızlı üs alma fonksiyonu için, bu size kümesi olarak üzerinde "aşırı yük" istediklerini yakalamak için vb matrisleri Daha genel

let rec pow (*) one a = function 
    | 0 -> one 
    | n -> pow (*) (if n mod 2 = 0 then one else one * a) (a * a) (n/2) 

let() = assert (pow (*.) 1. 2. 3 = 8.) 

, evet, fikir üzerinde kullanılabilir operatörler (burada infix operatörleri, ancak düz isimler iyi ve okunabilirlik için genellikle daha iyidir) ve bu operasyonların sözlükleri üzerinde etraflı ve soyut - aslında Haskell tipi sınıfların derlenmesi gibi.

+0

Burada I32 modülünde bir 'açık Int32' yaptığınızı fark ettim, bunun yerine orada bir 'Int32'yi dahil etmiş olsaydınız ne farklı olurdu? Bu bağlamda esas olarak eşdeğer mi? – aneccodeal

+1

@aneccodeal: bu çok farklı olurdu: eğer 'include' kullanmış olsaydım, bu 'I32 'tüm Int32'leri içerir, yani' I32' yerel olarak açmak özellikle Int32'nin tüm tanımlarını alır. Kullanıcı açıklamalarını gölgelemekten dolayı büyük açıkları açmamayı tercih ederim. – gasche

İlgili konular