F # Unità di misura: "sollevare" i valori per fare galleggiare < qualcosa >
-
03-07-2019 - |
Domanda
Quando si importano numeri da un file CSV, è necessario convertirli in float con unità.
Attualmente lo faccio con una funzione incorporata:
data |> List.map float |> List.map (fun n -> n * 1.0<m>)
Ma mi chiedo se esiste un modo più elegante per farlo - o devo creare il mio modulo 'unità' con funzioni di conversione?
Ciò che sarebbe davvero bello sarebbe qualcosa del genere, ma dubito che sia possibile ...
data |> List.map float |> List.map lift<m>
Questo è l'opposto della mia domanda precedente ( Come per rimuovere genericamente le unità di misura F # ).
AGGIORNAMENTO: per le unità fatte in casa, ho provato questo, che funziona bene:
[<Measure>]
type km =
static member lift (v:float) = v * 1.0<km>
data |> List.map float |> List.map km.lift
oppure, seguendo la domanda in questa risposta ??a >
data |> List.map (float >> km.lift)
Soluzione
Sembra che le unità di misura non possano essere parametri di tipo per il momento (non ho idea se questo cambierà). Quindi il modo più breve per scrivere questo è:
data |> List.map float |> List.map ((*) 1.0<m>)
Modifica
Vedi anche ora FloatWithMeasure
qui
http://msdn.microsoft.com/ it-it / library / ee806527 (VS.100) aspx
Altri suggerimenti
C'è qualche motivo per cui devi mappare due volte? Cosa c'è di sbagliato in questo:
data |> List.map (fun x -> (float x) * 1.0<m>)