4

我正在调用需要的外部函数float[],但我的数组是float<m>[]. 我怎样才能从数组中删除度量单位?

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

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

4 回答 4

3

我相信演员 to obj,然后是动态演员 tofloat[]会起作用,例如

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

因为没有运行时表示。

可能还看到

F# 度量单位 - 将值“提升”到浮动<something>

如何一般地删除 F# 度量单位

于 2012-07-09T22:26:28.600 回答
1
[<Measure>]type m
let f (arr : float[]) : float = 0.0
let arr = [|1.0<m>|]
f (unbox (box arr))
于 2012-07-09T22:28:58.970 回答
1
let demeasure (arr: float<m>[])  = arr |> Array.map (fun i -> float i)
于 2013-01-24T15:57:38.497 回答
1

这是任何数字类型、任何度量单位的通用解决方案,但仅适用于数组。如果我们有 Higher Kinds,它也可以在容器上通用:

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|]
于 2020-07-02T06:11:25.940 回答