F#内联如何工作?

时间:2010-12-10 21:05:39

标签: c# f# inline

使用F#,我理解您可以使用inline关键字在呼叫站点执行类型特化。那是::

val inline (+) : ^a -> ^b -> ^c
      when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)

约束^a^b必须有一个静态成员,如op_Addition,或其中一个内置基元,可用于填补空白。

因此,如果你有一个带有+的方法,你传入一个int和一个short作为参数,它会向一个指令解包+使用int的内置原语,如果你传入一个浮点数和一个字节它使用float原语添加操作码。

在编译时如何完成?你怎么能在CLR中有一个方法根据类型切换它使用的操作码或方法?

Reflection.Emit可以实现这种行为吗? 我理解内联是在调用站点执行的,这是否意味着代码不能与C#一起使用?

1 个答案:

答案 0 :(得分:9)

正如inline所建议的那样,代码在呼叫站点处内联。在每个调用站点,您都知道具体类型参数^T,因此将插入该类型的特定代码。

这是由F#编译器完成的,你不能在其他上下文中轻松完成(比如C#或Ref.Emit)。

F#库有一些内联函数仍然可以被其他语言调用,这些实现的运行时根据运行时类型进行动态调度,参见例如:感谢F#Core库代码中AdditionDynamicprim-types.fs的代码。