【问题标题】:Strip Unit of Measure from array从数组中去除度量单位
【发布时间】:2012-07-09 09:09:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: arrays f# units-of-measurement


    【解决方案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|]
    

    【讨论】:

      【解决方案2】:
      let demeasure (arr: float<m>[])  = arr |> Array.map (fun i -> float i)
      

      【讨论】:

        【解决方案3】:

        我相信先转换为obj,然后再动态转换为float[] 会起作用,例如

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

        因为没有运行时表示。

        也可以看看

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

        How to generically remove F# Units of measure

        【讨论】:

          【解决方案4】:
          [<Measure>]type m
          let f (arr : float[]) : float = 0.0
          let arr = [|1.0<m>|]
          f (unbox (box arr))
          

          【讨论】:

            猜你喜欢
            • 2011-08-03
            • 1970-01-01
            • 2012-09-01
            • 2011-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-20
            相关资源
            最近更新 更多