2016-03-11 15 views
6

Mam problem z F # Jednostki miary podczas definiowania operatora, który ma parametr z ogólną jednostką miary zdefiniowaną w kategoriach ogólnej jednostki miary z innego parametru. NpF # jednostki ogólne w parametrach zdefiniowanych względem siebie

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)) 

Tutaj y jest zdefiniowana w <'a/'b>, gdzie <'a> to jednostka x. Oczekuję, że typ (|/) będzie int64<'a> -> int64<'a/'b> -> Quotient<'b>, jednak kompilator mówi mi, że typ to x:int64<'b> -> y:int64 -> Quotient<'b>.

Chcę tego użyć do konwersji typów, w których liczby dziesiętne nie są możliwe. Moim celem było stworzenie operatorów do pracy z Quotients zamiast logicznego obliczania reszty w każdej konwersji typu. Czy jest możliwe osiągnięcie tego celu, czy też powinienem inaczej podchodzić do konwersji typu?

Odpowiedz

10

Interesujące pytanie. Jeśli usuniesz 'a/'b i zastąpisz go 'b, zobaczysz, że kompilator nagle ostrzega operatora -.

Mówi ci, że jednostki po lewej i prawej stronie odejmowania muszą być takie same, aby ograniczyć 'b, aby mieć miarę 1. Czemu?

x posiada jednostek 'a

q posiada jednostek 'b

Ta mówi, że rzeczywiście trzeba dwa parametry miarą Twojego ilorazu.

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

To ma sens, ponieważ każda reszta będzie w oryginalnych jednostkach.

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) 
Powiązane problemy