Единицы измерения F # в зависимости от типа - PullRequest
2 голосов
/ 25 сентября 2010

Я пытаюсь написать конвертер «единиц измерения» в F #.

Я определил две единицы измерения, KWh и MWh, и я пытаюсь написать функцию для преобразования между ними, которая будет соответствовать шаблону числового типа. У меня может быть число с плавающей запятой, десятичное число, целое число кВтч для преобразования в МВтч.

[<Measure>]
type KWh

[<Measure>]
type MWh

// want to do this, but can't because x is not x:obj, 
// its something like x:float<KWh>
let toMWh x = 
    match x with
    | :? float<KWh>     -> x * (1.0<MWh>/1000.0<KWh>)
    | :? int<KWh>       -> // ...


// above code not valid f#

Я не могу понять, как правильно переходить по типу, когда у меня нет типа obj.

1 Ответ

3 голосов
/ 25 сентября 2010

Честно говоря, я бы выбрал малобюджетное решение для перегрузки:

[<Measure>] 
type KWh 

[<Measure>] 
type MWh 

type Convert = 
    static member toMWh (x:float<KWh>) =  x * 1.0<MWh> / 1000.0<KWh>
    static member toMWh (x:int<KWh>) =  x * 1<MWh> / 1000<KWh>

printfn "%d" (int(Convert.toMWh(5000<KWh>)))
printfn "%f" (float(Convert.toMWh(5500.0<KWh>)))

Тем не менее, кто-то может придумать умный, безопасный для типов способ сделать это с помощью inline (Iне уверен, если это возможно, если это возможно).Я бы избежал вашего соответствия во время выполнения, так как оно жертвует статической безопасностью типов (что является своего рода точкой единиц).(Кроме того, в любом случае невозможно выполнить сопоставление модулей во время выполнения, поскольку модули удаляются во время компиляции.)

...