2017-01-11 31 views
6

To jest pierwsza linia F #, którą próbowałem pisać, więc przepraszam, bo prawdopodobnie nie znam właściwych słów kluczowych Google do wyszukiwania.F # Parametry funkcji Typ danych

Próbowałem definiowania funkcji tak:

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

To daje mi błąd na System.Math.Exp(-x):

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

Chyba spodziewałem kompilator zrobić typu wnioskowanie na tej funkcji i zdefiniuj x jako zmienną. Czego tu mi brakuje?

Oto cała sprawa, że ​​próbuję podłączyć:

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

Kompilator podaje 'x' jako' int', ponieważ użyłeś go w rzeczach takich jak '1 - x'. '1' będzie zawsze liczbą całkowitą i można go używać tylko w wyrażeniach arytmetycznych wraz z innymi liczbami całkowitymi. Twój kod kompiluje się, jeśli zmienisz wszystkie swoje zastosowania od "1" do "1.0", co sprawi, że będzie on 'float' i sprawi, że' x' będzie również wywnioskowane jako 'float'. – TeaDrivenDev

+1

(Jest to na przykład inne niż C#, które wymusi typy, jeśli to konieczne, pozwalając tym samym na mieszanie liczb całkowitych i liczb zmiennoprzecinkowych w tych samych wyrażeniach.) – TeaDrivenDev

+0

@TeaDrivenDev Awesome! To był zdecydowanie problem i coś nowego do oglądania w przyszłości. Jeśli chcesz udzielić odpowiedzi, mogę zaakceptować – darkpbj

Odpowiedz

6

Kompilator wnioskuje x jak int, bo użył go w rzeczach jak 1 - x. Prosta 1 będzie zawsze liczbą całkowitą i można jej używać tylko w wyrażeniach arytmetycznych wraz z innymi liczbami całkowitymi. Twój kod kompiluje się, jeśli zmienisz wszystkie swoje zastosowania z 1 na 1.0, co spowoduje, że będzie to float i może być również wywnioskowane jako jako float.

To różni się od C#, na przykład, co zmusi typy, jeśli to konieczne, a tym samym pozwoli na mieszanie liczb całkowitych i liczb zmiennoprzecinkowych w tych samych wyrażeniach. Może to jednak prowadzić do przypadkowej utraty precyzji w pewnych okolicznościach, podczas gdy F # zawsze zmusza do jawnego stwierdzenia koniecznych konwersji.