2009-10-01 16 views
9

Kullanıcı tanımlı bir kare kök işlevi (sqrt), F # 'nin unit system ile doğru şekilde etkileşime girecek şekilde nasıl yazılabileceğini merak ettim.Birim güvenli kare kökleri

o gibi olmalıdır Ne:

 
let sqrt (x : float<'u^2>) = 
    let x' = x/1.0<'u^2> // Delete unit 
    (x ** 0.5) * 1.0<'u>  // Reassign unit 

Ama bu nedeniyle sıfırdan farklı sabitler jenerik birimleri sahip izin verilmemesi izin verilmez.

Bu işlevi yazmanın bir yolu var mı? Yerleşik sqrt ile iyi çalışıyor, bu yüzden sihir ne yapıyor?

+1

İlgili soru: (ayrıca Kvb tarafından yanıtlanmıştır) http://stackoverflow.com/questions/1398611/f-ununit-reunit-inside-a-function – Benjol

cevap

6

Sıfır olmayan genel sabitlere izin vermek, birimler için tip sisteminin güvenliğini kırmayı çok kolaylaştırabilir (bkz. Andrew Kennedy'nin papers). Son cevabınızın cevabının, sqrt'un aslında bir anlamda sihir olduğuna inanıyorum ki, normal yollarla bu tip imzayla parametrik bir fonksiyon tanımlamak mümkün olmamalıdır.

ise:

let sqrt (x : float<'u^2>) = 
    let x' = (float x) ** 0.5 (* delete unit and calculate sqrt *) 
    ((box x') :?> float<'u>) 
6

@kvb daha genel olarak haklı: Ancak, (F # geçerli sürümünde en azından) boks ve döküm yararlanarak istediğini yapmak mümkündür üniteden bağımsız bir algoritma (örneğin 'küp kökünü yazdığınızı varsayalım') var ve birimlerin üzerine koymak istediğinizde, algoritmayı doğru tip imzalı bir işleve sarabilirsiniz ve Birimleri içeriye gönderirken "atar" ve bir sonraki çıkışa uygun birimleri "tekrar eklemek" için kutu-ve-downcast yaklaşımı.

RTM sürümünde (Beta2'den sonra), F #, 'arka birimleri ekle' için ilkel kütüphane işlevlerine sahip olacaktır, çünkü kutu-ve-downcast yaklaşımı şu anda bu ilkel öğelerin eksikliğini gidermek için şu anda bir kesmek gibidir. dil/kütüphane.

+0

Teşekkürler - Bu yeni kitaplık işlevlerini (Link) adlandırabilir misiniz? – Dario

+3

Muhtemelen, örn. "inline FloatWithMeasure: float -> Float <'u>", "LanguagePrimitives" modülünde. – Brian

+0

Ve işte burada: http://msdn.microsoft.com/en-us/library/ee806527(VS.100).aspx – Benjol

İlgili konular