2015-08-23 6 views
0

Я хотел бы определить типМожно ли определить единицы измерения для kB, GB, ... с явным или неявным преобразованием?

[<Measure>] type kB 

мера, которая преобразуется в число байтов, когда явно приводится к междунар:

(int)7<kB> // would result 1024kB - explicit would be fine 

Поскольку нет никакого способа, чтобы добавить явное преобразование оператора к типу, как в C#, я застрял. У кого-то есть идея? Еще лучше было бы неявное преобразование, так что, когда функция требует количества байт, это можно назвать как

Allocate(7<kB>) // implicit would be superfine 

Специальных функции преобразования не обращается - написание функции кБ тривиально, но не так хорошо, :

let kB(n) = 1024 * n 
kB(7) 
7 |> kB 

функция преобразования, которая делает то же самое с блоками не круто либо

7<kB> |> convertToByte 
+0

Возможно, вы соответствуете этой опции? https://dotnetfiddle.net/KgaqqL –

+0

Я * думаю * (но я не уверен), что это невозможно, и кажется, что этот вопрос близко по духу к [этому] (http://stackoverflow.com/q/ 21862335/1180426). Там есть хак, который может помочь вам, но в целом нет подходящего подхода. Кроме того, [здесь ссылка из ответа] (http://trelford.com/blog/post/Units-of-measure-auto-conversion.aspx) с другим подходом, но это не без затрат по сравнению с обнаженными единицами измерения. –

+0

@ PatrykĆwiek thx много, да все это там. – citykid

ответ

1

Активные шаблоны «круто» достаточно для вас?

[<Measure>] type kB 

// single case active pattern to convert from kB to raw B value 
let (|Bytes|) (x : int<kB>) = int(x * 1024) 

// use pattern matching in the declaration 
// val printBytes : int<kB> -> unit 
let printBytes (Bytes(b)) = 
    printfn "It's %d bytes" b 

printBytes 7<kB> 
// "It's 7168 bytes" 
+0

ну, это сложная версия вызова функции. – citykid

+0

Как сделать gB и tB также доступными? –

0

Короткий ответ на ваш вопрос, похоже, нет. Который меня поражает, потому что это преобразование немного сдвинуто. Увы, как насчет статических методов, как указано в «Программирование f # 3.0» на стр. 108?

[<Measure>] 
type B = 
    static member toKB (x: int<B>) = 
     1<KB> * x/1024<B> 

and [<Measure>] KB = 
    static member toB (x: int<KB>) = 
     x * 1024<B>/1<KB> 

let b1 = 1024<B> 
let kb1 = B.toKB b1