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

Joh*_*son 3 f# type-inference inline

今天我用F#玩了一下,写道:

let sq x = x * x

let i = sq 3
let d = sq 3.0
Run Code Online (Sandbox Code Playgroud)

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

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

Mis*_*hor 6

类型推断有效,因此您的函数sq具有类型int -> int,因为第一次编译器看到您使用该函数时,您传递一个整数.所以它假定这sq是一个取整数的函数,并且通过函数(x * x)的定义,它也返回一个整数.

在F#中定义一个完全通用的算术函数有点复杂,但一种方法是创建函数inline,如下所示:

let inline sq x = x * x
Run Code Online (Sandbox Code Playgroud)

这样,每次在调用站点sq都会内联函数体,因此使用内联函数将与每次使用时替换它的正文相同.

这种方法有它的缺点,我认为看到这个问题会很有趣.