【发布时间】:2014-10-16 14:16:08
【问题描述】:
在寻找有关内联函数的静态解析类型参数的信息时,我偶然发现了 FSharp.Core 中 various primitive operators 的定义:
let inline (+) (x: ^T) (y: ^U) : ^V =
CheckedAdditionDynamic<(^T),(^U),(^V)> x y
when ^T : int32 and ^U : int32 = (# "add.ovf" x y : int32 #)
when ^T : float and ^U : float = (# "add" x y : float #)
// <snip>
when ^T : ^T = ((^T or ^U): (static member (+) : ^T * ^U -> ^V) (x,y))
从上面的 sn-p 中可以看出,when 关键字的使用格式为:when expr1 = expr2 用于各种内置类型。我猜这是某种编译器等价于“if T=int use opcode add.ovf, else if ..., else do that”。
但是,我在 F# 文档中找不到对这种语法的单一参考/解释。有一些 F# 内部知识的人能解释一下上面那个 sn-p 中发生了什么吗?
【问题讨论】:
-
请注意,您不能在标准 F# 中使用此语法(或
(# ... #)语法)。 -
它似乎被称为静态条件优化,我认为它不应该在核心库之外使用 - 你可以看看你是否尝试使用它并检查编译器错误;)跨度>
标签: f#