2017-01-11 3 views
6

est la première ligne de F # que je l'ai essayé d'écrire, donc des excuses parce que je ne sais probablement pas les bons mots-clés de Google pour la recherche.F # Fonction Paramètre Ce type de données

J'ai essayé de définir une fonction comme ceci:

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

Cela me donne une erreur sur la System.Math.Exp(-x):

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

Je suppose que je me attendais le compilateur de faire l'inférence de type sur cette fonction et définir x comme un flotteur. Qu'est-ce que j'oublie ici?

est ici la chose que je suis en train de brancher:

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

Le compilateur infère '' x' comme int', parce que vous avez utilisé dans des choses comme '1 - x'. '1' sera toujours un entier, et vous ne pouvez l'utiliser que dans les expressions arithmétiques avec d'autres entiers. Votre code compile si vous changez tous vos usages de '' 1' à 1.0', qui fera un '' float' et causer x' être inférées comme 'float' aussi bien. – TeaDrivenDev

+1

(Ceci est différent de C#, par exemple, ce qui forcera les types si nécessaire et permettent ainsi de mélanger des nombres entiers et nombres à virgule flottante dans les mêmes expressions.) – TeaDrivenDev

+0

@TeaDrivenDev Impressionnant! C'était vraiment le problème, et quelque chose de nouveau à surveiller dans le futur. Si vous voulez faire une réponse je peux accepter – darkpbj

Répondre

6

Le compilateur infère x comme int, parce que vous avez utilisé dans des choses comme 1 - x. Un 1 simple, se toujours être un entier, et vous ne pouvez l'utiliser dans des expressions arithmétiques avec d'autres entiers. Votre code compile si vous modifiez tous vos usages de 1 à 1.0, ce qui en fera un float et provoquera également x comme float.

Ceci est différent de C#, par exemple, ce qui forcera les types si nécessaire et permettent ainsi de mélanger des nombres entiers et nombres à virgule flottante dans les mêmes expressions. Cela peut conduire à une perte accidentelle de précision dans certaines circonstances, alors que F # vous oblige toujours à indiquer explicitement les conversions nécessaires.