F # Единицы измерения - «поднятие» значений для плавания <something> - PullRequest
3 голосов
/ 07 января 2009

При импорте чисел из 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)

Ответы [ 2 ]

2 голосов
/ 07 января 2009

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

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

EDIT

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

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

1 голос
/ 08 января 2009

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

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