This question is closely related to these ones (1, 2, 3)
I'm using an external library which doens't (yet) handle units of measure. I want to be able to 'ununit' values before I pass them in, then 'reunit' them when I get the results back.
The catch is that I'd like to avoid being forced to declare WHICH units in advance.
Example snippet
let ExternalNonUnitAwareFunction s = s + 1.
let MyUnitAwareClient (s:float<'u>) = //'
//1. this option "flattens" to no unit, or fixes to first inferred unit
//let (unit:float<'u>) = 1.0<_>
//2. this works fine, except for 0!
let unit = s / (float s)
s |> float |> ExternalNonUnitAwareFunction |> (*) unit
I haven't managed to work out how to handle this one...
Update If I have understood correctly, the final version of F# will include functions to do this.
For now, boxing and casting appears to work:
let MyUnitAwareClient (s:float<'u>) =
let result = s |> float |> ExternalNonUnitAwareFunction
(box result :?> float<'u>)
I wouldn't be surprised if the units of measure stuff goes through some further changes before release, though, which might break this. You can also make a more generic version, such as:
let reunit (f:float -> float) (v:float<'u>) =
let unit = box 1. :?> float<'u>
unit * (f (v/unit))
EDIT
There is now a FloatWithMeasure function to 'cast to units':
http://msdn.microsoft.com/en-us/library/ee806527(VS.100).aspx
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With