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'
.
类型推断有效,因此您的函数sq
具有类型int -> int
,因为第一次编译器看到您使用该函数时,您传递一个整数.所以它假定这sq
是一个取整数的函数,并且通过函数(x * x
)的定义,它也返回一个整数.
在F#中定义一个完全通用的算术函数有点复杂,但一种方法是创建函数inline
,如下所示:
let inline sq x = x * x
Run Code Online (Sandbox Code Playgroud)
这样,每次在调用站点sq
都会内联函数体,因此使用内联函数将与每次使用时替换它的正文相同.
这种方法有它的缺点,我认为看到这个问题会很有趣.