F# Единицы измерения — «поднятие» значений до уровня float<something>

StackOverflow https://stackoverflow.com/questions/419521

  •  03-07-2019
  •  | 
  •  

Вопрос

При импорте чисел из файла CSV мне нужно преобразовать их в числа с плавающей запятой с помощью единицы измерения.

В настоящее время я делаю это с помощью встроенной функции:

data |> List.map float |> List.map (fun n -> n * 1.0<m>)

Но мне интересно, есть ли более элегантный способ сделать это - или мне нужно создать свой собственный модуль «единиц» с функциями преобразования?

Было бы здорово, если бы было что-то вроде этого, но я сомневаюсь, что это возможно...

data |> List.map float |> List.map lift<m>

Это противоположность моему предыдущему вопросу (Как удалить единицы измерения F# в целом).

ОБНОВЛЯТЬ:Для самодельных агрегатов я попробовал это, работает нормально:

[<Measure>]
type km = 
    static member lift (v:float) = v * 1.0<km>

data |> List.map float |> List.map km.lift

или, следуя вопросу в этот ответ

data |> List.map (float >> km.lift)
Это было полезно?

Решение

Похоже, что единицы измерения на данный момент не могут быть параметрами типа (не знаю, изменится ли это).Итак, самый короткий способ написать это:

data |> List.map float |> List.map ((*) 1.0<m>)

РЕДАКТИРОВАТЬ

Смотрите также сейчас FloatWithMeasure здесь

http://msdn.microsoft.com/en-us/library/ee806527(VS.100).aspx

Другие советы

Есть ли какая-то причина, почему вы должны наносить на карту дважды? Что не так с этим:

data |> List.map (fun x -> (float x) * 1.0<m>)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top