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