f# - 为什么不能使用不同类型的参数两次使用相同的函数?

标签 f# inline type-inference

我今天玩了一点 F#,写了这个:

let sq x = x * x

let i = sq 3
let d = sq 3.0

如果我删除第三行或第四行,它会编译,但如果两者都存在,则不会编译。

我收到错误 This expression should have type 'int', but has type 'float' .

最佳答案

类型推断有效,因此您的函数 sq有类型 int -> int ,因为编译器第一次看到你使用那个函数,你传递给它一个整数。所以它假设 sq是一个接受整数的函数,根据函数的定义 ( x * x ) 它还返回一个整数。

在 F# 中定义一个完全通用的算术函数有点复杂,但一种方法是使函数 inline ,像这样:

let inline sq x = x * x

这样你的函数体每次都会在调用站点被内联,所以使用内联 sq function 将与每次使用时替换它的 body 相同。

这种方法有它的缺点,我认为你看到 this question 会很有趣。 .

关于f# - 为什么不能使用不同类型的参数两次使用相同的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17762670/

相关文章:

f# - 在 F# 中重写 Erlang

c++ - auto 和 __auto_type 之间有什么区别吗?

selenium - 如何折叠 F# 中受歧视联合的匹配项

f# - 何时在 F# 中使用区分联合与记录类型

.net - 在 .NET/F 中将 OAuth 与 Jira REST 调用结合使用#

c++ - extern 内联函数被引用但未定义

jQuery to FadeOut 由 HTML 内联样式声明的背景图像

c++ - header 中的 "inline"是否需要 "void f(auto) {}"?

typescript - 如何根据可选参数的类型确定返回类型

scala - 在哪里可以找到 Scala 类型推断的详细信息?