2016-03-11 10 views
6

Başka bir parametreden genel ölçü birimi cinsinden tanımlanmış genel bir ölçü birimine sahip bir parametresi olan bir operatör tanımlanırken F # Ölçü Birimleri ile ilgili bir sorun yaşıyorum. Örneğin:F # birbirinden bağımsız olarak tanımlanmış parametrelerdeki jenerik birimler

Burada
type Quotient<[<Measure>]'b> = 
| Divisible of int64<'b> 
| Remaindered of int64<'b> * int64<'b> 

let (|/) (x: int64<'a>) (y: int64<'a/'b>) = 
    let q = x/y 
    if q * y = x then Divisible q else Remaindered (q, x - (q * y)) 

, y<'a>x birimidir <'a/'b>, tanımlanmıştır. (|/) türünün int64<'a> -> int64<'a/'b> -> Quotient<'b> olmasını bekliyorum, ancak derleyici bana türün x:int64<'b> -> y:int64 -> Quotient<'b> olduğunu söylüyor.

Ondalık sayıların mümkün olmadığı yerlerde bu tür dönüşümler için kullanmak istiyorum. Amacım, her tür dönüşümde geri kalanını hesaplamak için mantığı koymak yerine, Bölümler ile çalışacak operatörler yaratmaktı. Bu hedefe ulaşmak mümkün mü yoksa tip dönüşümlerime farklı bir şekilde gitmeli miyim?

cevap

10

İlginç bir soru. 'a/'b'u çıkarır ve 'b ile değiştirirseniz, derleyicinin aniden size - işleci hakkında bir uyarı verdiğini görürsünüz.

Bu, çıkarma işleminin solunda ve sağında bulunan birimlerin aynı olması gerektiğini belirtiyor, dolayısıyla 'b ölçüsünü 1 ölçüsünde sınırlandırıyor. Niye ya?

x gerçekte bölüm için iki ölçü parametrelerini gerektiğini bu anlatır 'b

birimlerine sahiptir 'a

q birimlerine sahiptir.

type Quotient<[<Measure>]'a, [<Measure>]'b> = 
    |Divisible of int64<'a> 
    |Remaindered of int64<'a> * int64<'b> 

Bu, herhangi bir geri kalanının orijinal birimlerde olacağı için mantıklıdır.

let (|/) (x: int64<'a>) (y: int64<'a/'b>) : Quotient<'b,'a> = 
    let q = x/y 
    if q * y = x then Divisible q else Remaindered (q, x - q * y) 
İlgili konular