从阵列剥离测量单位

时间:2012-07-09 22:19:09

标签: arrays f#

我正在调用需要float[]的外部函数,但我的数组是float<m>[]。 我如何从阵列中剥离度量单位?

我需要类似下面的函数,但这不能编译。 我希望避免任何迭代或重复的数组,因为float<m>float值是相同的...

let demeasure (arr:float<m>[]): float[] = float[] (arr)

4 个答案:

答案 0 :(得分:2)

我相信对obj的强制转换,然后动态转换为float[]会有效,例如

(arr :> obj) :?> float[]

因为没有运行时表示。

可能也会看到

F# Units of measure - 'lifting' values to float<something>

How to generically remove F# Units of measure

答案 1 :(得分:2)

[<Measure>]type m
let f (arr : float[]) : float = 0.0
let arr = [|1.0<m>|]
f (unbox (box arr))

答案 2 :(得分:1)

这是一种通用解决方案,适用于任何数字类型,任何度量单位,但仅适用于数组。如果我们有高级种类,也可以在容器上将其设为通用:

let inline retype (x: 'T) : 'U = (# "" x: 'U #)

module Array =
    let inline stripUoM (x: '``Num<'M>`` []) =
        let _ = Unchecked.defaultof<'``Num<'M>``> * (LanguagePrimitives.GenericOne : 'Num)
        retype x :'Num []
// Usage

[<Measure>]type m

let x = [|34.0<m>; 9.0<m>; 42.0<m> |] |> Array.stripUoM
// val x : float [] = [|34.0; 9.0; 42.0|]

let y = [|34<m>; 9<m>; 42<m> |] |> Array.stripUoM
// val y : int [] = [|34; 9; 42|]

答案 3 :(得分:0)

  

让demeasure(arr:float [])= arr |&gt; Array.map(fun i - &gt; float i)