看到F#的inline关键字,马上会联想到C++中也有这个。然而因为F#有类型推导的特性,两者结合起来使本来不起眼的关键字变得神通广大。
因为F#支持泛型,并且有自动泛化的功能,所以很多时候F#用起来跟动态语言很相像。然而也有碰壁的时候,譬如:
let add a b = a + b let f1 = add 1uy let f2 = add 1
代码第一行声明了一个函数,第二行使用byte值为参数调用一次,第三行再使用int值调用,这时候就提示语法错误了。因为第二行代码已经确认了函数使用的是byte类型。这函数也不能强行指定使用泛型,因为(+)不是一个泛型函数(在C#中也同样实现不了这个add泛型函数)。但是,F#中,把函数声明成inline的,问题就解决了:
let inline add a b = a + b let f1 = add 1uy let f2 = add 1
因为是inline,所以每次调用add时,都重新匹配了一次(+)函数。使得两次调用add都是用了不同的(+)函数。现在是不是有点像动态语言了?但是它是有类型检查的哦。
最后回顾之前泛型特化的一个例子,如果换成inline会让事情变得简单多了。下次,我再来讲解如何用 inline 来简化这个例子。
原文:http://www.cnblogs.com/greatim/p/4976016.html