Wahrscheinlich eine dumme Frage, aber ich habe gerade mit F # begonnen und ich habe ein kleines Problem.
Angenommen, ich habe eine Funktion wie diese:
%Vor%Wenn ich das so nenne:
%Vor%Alles ist in Ordnung, das Ergebnis ist 10.
Wenn ich es so nenne:
%Vor%Ich erwarte als Ergebnis 5 oder 5.0. Das eigentliche Ergebnis ist jedoch:
let result = MultiplyByTwo 2.5 ;; --------------------------------- ^^^
stdin (4,28): Fehler FS0001: Dieser Ausdruck hatte den Typ
%Vor%aber hier ist Typ
%Vor%
Da ich möchte, dass diese Funktion etwas generisch ist (d. h. sowohl Fließkommazahlen als auch ganze Zahlen akzeptiert), mag ich das nicht. Meine Frage natürlich: Wie löst man das?
Wenn Sie ein numerisches Literal in F # schreiben (z. B. 2
oder 3.14
), behandelt der Compiler das als Wert eines bestimmten Typs, und daher ist Code, der numerische Literale verwendet, nicht polymorph. Sie können Eingaben entweder in einen einzigen Typ konvertieren und mit diesem Typ arbeiten (wie float
in der Antwort von desco) oder erweiterte Funktionen von F # verwenden ...
Bestimmte numerische Operationen können in einer polymorphen Weise geschrieben werden, wenn Sie den Code als inline
markieren (auf diese Weise kann der Compiler zusätzliche Einschränkungen darstellen und sie statisch auflösen) und wenn Sie nur polymorphe Primitive (mit zusätzlichen statischen Einschränkungen) verwenden ).
Standardoperatoren sind polymorph in inline
functions und die F # -Bibliothek bietet eine Möglichkeit, einen polymorphen Wert zu erhalten, der 1 und 0 repräsentiert (aber nicht 2), aber das reicht aus, um die gewünschte Funktion zu schreiben:
Wenn Sie das schöner machen wollen, können Sie ein numerisches Literal definieren (siehe Daniels Antwort auf die frühere StackOverflow-Frage ) und dann kann man eigentlich nur schreiben:
%Vor% Das spezielle numerische Literal 2G
wird in einen Aufruf einer Funktion von NumericLiteralG
übersetzt, die die angegebene Anzahl von generischen 1 Werten unter Verwendung der oben verwendeten Technik summiert (daher ist es für große Zahlen nicht effizient!) Weitere Informationen finden Sie auch in meinem aktuellen Artikel zu generischen numerischen Code in F # schreiben .
Denken Sie, dass Sie mit diesem gefüllt sind. Der Typ wird abgeleitet, weil 2 ein Int ist, Sie könnten 2.0 oder 2f verwenden, aber dann wären alle Ihre Ergebnisse Floats.
Denken Sie, dass Sie tiefer in das Tutorial für sein Eins vertiefen müssen, ich auch nicht, also kann ich nicht viel helfen.
Wenn Sie keine Angst haben, "kleine Hacks" zu verwenden, könnte dies nützlich sein:
%Vor%Dieses Konstrukt ist nicht typsicher, da die Typprüfung zur Laufzeit erfolgt. Zitate sind auch relativ langsam.
Tags und Links f# functional-programming