F # Unités de mesure - Valeurs "élévatrices" pour faire flotter < quelque chose >
-
03-07-2019 - |
Question
Lors de l'importation de numéros à partir d'un fichier csv, je dois les convertir en nombres flottants avec l'unité.
Actuellement, je le fais avec une fonction en ligne:
data |> List.map float |> List.map (fun n -> n * 1.0<m>)
Mais je me demande s'il existe un moyen plus élégant de le faire - ou dois-je créer mon propre module "unités" avec des fonctions de conversion?
Ce qui serait vraiment bien serait quelque chose comme ça, mais je doute que ce soit possible ...
data |> List.map float |> List.map lift<m>
C’est le contraire de ma question précédente ( Comment supprimer génériquement F # Unités de mesure ).
UPDATE: Pour les unités faites à la maison, j'ai déjà essayé cette méthode qui fonctionne bien:
[<Measure>]
type km =
static member lift (v:float) = v * 1.0<km>
data |> List.map float |> List.map km.lift
ou, en suivant la question dans cette réponse
data |> List.map (float >> km.lift)
La solution
Il semble que les unités de mesure ne peuvent pas être des paramètres de type pour le moment (aucune idée si cela changera). Le moyen le plus rapide d’écrire ceci est donc:
data |> List.map float |> List.map ((*) 1.0<m>)
EDIT
Voir aussi maintenant FloatWithMeasure
ici
http://msdn.microsoft.com/ en-us / library / ee806527 (VS.100) .aspx
Autres conseils
Y a-t-il une raison pour laquelle vous devez cartographier deux fois? Quel est le problème avec ceci:
data |> List.map (fun x -> (float x) * 1.0<m>)