F#内联如何工作?
使用F#,我理解您可以使用inline关键字在呼叫站点执行类型特化。 那是::
val inline (+) : ^a -> ^b -> ^c when (^a or ^b) : (static member (+) : ^a * ^b -> ^c)
约束^a
或^b
必须具有静态成员,如op_Addition
或其中一个内置基元,可用于填补空白。
因此,如果你有一个方法有一个+,你传入一个int和一个short作为参数,它解包+一个指令使用int的内置原语,如果你传入一个浮点数和一个字节,它使用浮点数原始加法操作码。
这在编译时是如何完成的? 你怎么能在CLR中有一个方法根据类型切换它使用的操作码或方法?
Reflection.Emit可以实现这种行为吗? 我知道内联是在调用站点执行的,这是否意味着代码不能与C#一起使用?
正如inline
,代码在调用站点处内联。 在每个调用站点,您都知道具体的类型参数^T
,因此在那里插入该类型的特定代码。
这是由F#编译器完成的,你不能在其他上下文中轻松完成它(比如C#或Ref.Emit)。
F#库有一些内联函数仍然可以被其他语言调用,这些实现的运行时基于运行时类型进行动态调度,参见例如F#Core库代码中的prim-types.fs
中的AdditionDynamic
代码一种感觉。