F# 函数参数数据类型

标签 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

最佳答案

编译器推断 xint ,因为你在 1 - x 之类的东西中使用了它.一个简单的1将始终为整数,并且只能在算术表达式中与其他整数一起使用。如果您更改 1 的所有用法,您的代码就会编译至 1.0 ,这将使它成为 float并导致 x被推断为 float以及。

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

关于F# 函数参数数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41581474/

相关文章:

swift - 类型安全和类型推断有什么区别?

f# - WebSharper浏览器的最低要求

android - 使用 Xamarin Android 与 F# 和 ReactiveUI 时出现运行时错误

f# - 静态成员可以重载吗?

c# - 为什么在没有返回值的 lambda 中添加 throw 会被推断为 Func<T> 而不是 Action?

typescript - TypeScript 中泛型子类型的推断

f# - 异步链式操作的类型不匹配错误

generics - F# 与具有通用返回类型的 C# 函数互操作

typescript - 键入一组泛型推断类型

ios - Swift 3 - 如何验证对象的类类型