F#函数参数数据类型

时间:2017-01-11 01:49:19

标签: f# type-inference

这是我尝试编写的F#的第一行,所以道歉,因为我可能只是不知道要搜索的正确Google关键字。

我尝试定义一个这样的函数:

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定义为float。我在这里缺少什么?

以下是我要插入的全部内容:

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 个答案:

答案 0 :(得分:6)

编译器将x推断为int,因为您在1 - x之类的内容中使用了它。一个简单的1 总是是一个整数,你只能在算术表达式中与其他整数一起使用它。如果您将1的所有用法更改为1.0,那么您的代码会进行编译,这将使其成为float并导致x被推断为float好。

这与C#不同,例如,如果需要,它将强制类型,因此允许在相同的表达式中混合整数和浮点数。但是,在某些情况下,这可能会导致精确度的意外损失,而F#总是强迫您明确说明任何必要的转换。