2017-01-11 4 views
6

Dies ist die erste Zeile von F #, die ich versucht habe zu schreiben, also entschuldige mich, weil ich wahrscheinlich einfach nicht die richtigen Google-Schlüsselwörter zum Suchen kenne.F # Funktionsparameter Datentyp

Ich habe versucht, eine Funktion wie die Definition so:

let sigmoid x deriv = if deriv then x * (1 - x) else 1/(1 + System.Math.Exp(-x)) 

Das gibt mir einen Fehler auf dem System.Math.Exp(-x):

The type 'float' does not match the type 'int' 

Ich glaube, ich war der Compiler erwartet Typinferenz auf diese Funktion zu tun und Definieren Sie x als Float. Was fehlt mir hier?

Hier ist die ganze Sache, die ich versuche, in stopfen:

let sigmoid x deriv = if deriv then x * (1 - x) else 1/(1 + System.Math.Exp(-x)) 

[<EntryPoint>] 
let main argv = 
    sigmoid 1.0 false |> printfn "%A" 
    0 
+1

Der Compiler leitet 'x' als' int' ein, weil Sie es in '' 1 - x'' verwendet haben. '1' wird immer eine ganze Zahl sein, und Sie können sie nur in arithmetischen Ausdrücken zusammen mit anderen Ganzzahlen verwenden. Dein Code kompiliert, wenn du all deine Verwendungen von "1" auf "1.0" änderst, was es zu einem "float" macht und bewirkt, dass "x" auch als "float" gedeutet wird. – TeaDrivenDev

+1

(Dies unterscheidet sich beispielsweise von C#, die die Typen nötigenfalls erzwingen und somit das Mischen von Ganzzahlen und Fließkommazahlen in denselben Ausdrücken ermöglichen.) – TeaDrivenDev

+0

@TeaDrivenDev Super! Das war definitiv das Problem und etwas, auf das man in der Zukunft achten sollte. Wenn du eine Antwort geben willst, kann ich akzeptieren – darkpbj

Antwort

6

Der Compiler folgert x als int, weil Sie es in Dinge wie 1 - x verwendet. Eine einfache 1 wird immer eine ganze Zahl sein, und Sie können es nur in arithmetischen Ausdrücken zusammen mit anderen Ganzzahlen verwenden. Ihr Code wird kompiliert, wenn Sie alle Ihre Verwendungen von 1 zu 1.0 ändern, was es zu einem float macht und x als float auch abgeleitet wird.

Dies unterscheidet sich beispielsweise von C#, die bei Bedarf die Typen erzwingen und somit das Mischen von ganzen Zahlen und Fließkommazahlen in denselben Ausdrücken ermöglichen. Dies kann unter bestimmten Umständen zu einem versehentlichen Genauigkeitsverlust führen, während F # Sie immer dazu zwingt, alle erforderlichen Konvertierungen explizit anzugeben.