2017-01-11 15 views
6

これはF#の最初の行です。私は書いたことがあるので、謝っています。おそらく、検索するGoogleの正しいキーワードがわからないからです。F#関数のパラメータのデータ型

私はそうのような関数を定義しようとした:

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

これは私にSystem.Math.Exp(-x)上のエラーを与える:

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

私は、この関数に型推論を行うには、コンパイラを期待していたと思いますし、 floatとしてxを定義します。私はここで何が欠けていますか?あなたは1 - xのようなもので、それを使用しているため、

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

コンパイラは、 '1 - x'のように使ったので、' x'を 'int'として推論します。 '1'は常に整数になり、他の整数と一緒に算術式でのみ使用できます。あなたのコードを '1'から' 1.0 'に変更すると、コードはコンパイルされ、 'float'となり、' x'は 'float'として推論されます。 – TeaDrivenDev

+1

(これは、たとえば、必要に応じて型を強制変換し、同じ式で整数と浮動小数点数を混合できるようにするC#とは異なります) – TeaDrivenDev

+0

@TeaDrivenDev Awesome!それは間違いなく問題であり、将来的には見守るべき新しいものでした。私が受け入れることができる答えをしたいなら – darkpbj

答えて

6

コンパイラはintとしてx推測:

は、ここで私はプラグインしようとしている全体のことです。 1となり、常にとなり、他の整数とともに算術式でのみ使用できます。 11.0に変更するとコードがコンパイルされ、floatになり、xfloatと推測されます。

これは、たとえば、必要に応じて型を強制変換し、同じ式に整数と浮動小数点数を混在させるC#とは異なります。しかし、F#は常に、必要な変換を明示的に指定する必要がありますが、特定の状況下では精度が偶然失われる可能性があります。

関連する問題