4 Stimmen

Wie man F# Maßeinheiten generisch entfernt

Ich habe einige Datenmanipulation Code, der csv am Ende ausspuckt.

Ich habe begonnen, das Programm zu aktualisieren, um überall Maßeinheiten hinzuzufügen, aber ich habe jetzt ein Problem mit meiner csv-Funktion:

val WriteCSV : string -> 'a list array -> 'b list -> string -> unit

(die Parameter sind fileName, column array, column headers, separator)

Wo ich vorher [|s;x;y|] an WriteCSV gesendet habe, habe ich jetzt ein Problem, denn ich kann nicht [|skm; xmm; ymm|] senden.

Ich habe versucht, eine Funktion zum generischen Entfernen von Maßeinheiten zu schreiben, aber es funktioniert nicht.

let removeUnit (n:float<_>) = n/1.0<_>

Meine Fragen sind:

  • Warum funktioniert es nicht?
  • Kann man sie zum Laufen bringen?
  • Gibt es eine andere Möglichkeit, dieses spezielle Problem zu lösen?

9voto

leen Punkte 7580

Wenn ich Ihr Problem richtig verstanden habe, wird durch die Umwandlung in einen "reinen" Float die Einheit entfernt. Zum Beispiel:

[<Measure>] type m
[<Measure>] type km

let removeUnit (x:float<_>) =
    float x

let foo = removeUnit 2.6<m>
let foo2 = removeUnit 2.1<km>

val removeUnit : float<'u> -> float

1voto

bmitc Punkte 43

Eine andere Möglichkeit ist die Verwendung der LanguagePrimitives.FloatWithMeasure Funktion.

Zum Beispiel:

let removeUnit (x: float<'u>) =
  x / (LanguagePrimitives.FloatWithMeasure<'u> 1.0)

Dies hat eine Typsignatur von:

val removeUnit: x: float<'u> -> float

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X