Удалить единицу измерения из массива

Я вызываю внешнюю функцию, требующую float[], но мой массив float<m>[]. Как я могу удалить единицу измерения из массива?

Мне нужно что-то вроде функции ниже, но она не компилируется. И я хотел бы избежать любой итерации или дублирования массива, поскольку значения float<m> и float идентичны ...

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

person mca    schedule 09.07.2012    source источник


Ответы (2)


Я считаю, что приведение к obj, за которым следует динамическое приведение к float[], будет работать, например

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

потому что нет представления во время выполнения.

Возможно см. Также

F # Единицы измерения - «подъем» значений в плавание ‹что-то› а>

Как в целом удалить единицы измерения F #

person Brian    schedule 09.07.2012

Вот общее решение для любого числового типа, любой единицы измерения, но только для массивов. Если бы у нас были более высокие типы, его можно было бы сделать универсальным и для контейнера:

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|]
person Gus    schedule 02.07.2020