2017-01-11 7 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' 

나는이 기능에 타입 추론을 할 컴파일러를 기다리고 있었다 추측을하고

나는 기능과 같이 정의했습니다 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

컴파일러는'x'를'int'로 추론합니다. 왜냐하면'1 - x'와 같이 사용하기 때문입니다. '1'은 항상 정수가 될 것이고 다른 정수와 함께 산술 표현식에서만 사용할 수 있습니다. '1'의 모든 사용법을'1.0'으로 변경하면 코드가 컴파일되어'float'이되고'x'가'float'으로 추론됩니다. – TeaDrivenDev

+1

(예를 들어, C#과 다른 점은 필요에 따라 유형을 강제 변환하므로 동일한 표현식에서 정수와 부동 소수점 숫자를 혼합 할 수 있음) – TeaDrivenDev

+0

@TeaDrivenDev Awesome! 그것은 분명히 문제 였고, 미래에 지켜보고 싶은 새로운 것이 었습니다. 당신이 대답을하고 싶으면 받아 들일 수 있어요. – darkpbj

답변

6

컴파일러는 intx 추론 :

여기에 내가 플러그인려고 온 것입니다. 1으로 항상이되며, 다른 정수와 함께 산술 표현식에서만 사용할 수 있습니다. 1의 모든 사용법을 1.0으로 변경하면 코드가 컴파일되어 float이되고 xfloat으로 유추됩니다.

예를 들어 C#과 다른 점은 필요한 경우 유형을 강제 변환하여 동일한 표현식에서 정수와 부동 소수점 숫자를 혼합 할 수 있도록하는 것입니다. 특정 상황에서는 우연히 정확도가 떨어질 수 있지만 F #은 항상 필요한 변환을 명시 적으로 명시해야합니다.