查找有关内联函数的静态解析类型参数的信息我偶然发现了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))
从上面的代码段中可以看出,when
关键字的格式为:when expr1 = expr2
,用于各种内置类型。我猜这是某种编译器相当于“如果T = int使用操作码add.ovf,否则如果......,否则就这样做。”
但是,我在F#文档中找不到这种语法的单一参考/解释。有一些F#内部知识的人可以解释上面那个片段中发生了什么吗?
答案 0 :(得分:2)
用户Carsten对此答案提供了以下评论,因为他认为这是错误的。
事情是:
when
按原样使用,与此无关 记录的用法 - 它似乎被称为静态条件 优化,不应该在核心库之外使用 - 确实继续尝试使用它 - 你会看到你不能除非 你使用约翰斯答案中提到的技巧(其他问题)
用户Carsten在此答案中添加了一条评论:
我添加了评论 - 我不认为我受过教育的猜测值得回答 - 我希望其中一个内部人员能够最终对其进行正式回答
Carsten的第一条评论中提到的答案是用户John Palmer在2013年4月的链接到他在(# ..... #)
语法上提供的答案,What is the (# ... #) syntax seen in F3 standard library implementation?
你实际上可以使用它,但你必须指定 您的代码中有
--compiling-fslib
个(未记录的)和--standalone
个标记。
用户MisterMetaphor提供了一个答案,引用了论坛中的帖子,其中说明了以下内容:
在F#代码中嵌入IL。这个功能是否得到官方支持?
不是真的。此功能的99.9%用于操作 在FSharp.Core.dll中定义(在1.9.2.9和之前称为fslib.dll)。
有关when
关键字的其他用法,请参阅以下内容。
此Microsoft文档介绍了使用when
关键字进行匹配的其他条件Match Expressions (F#)。
此Microsoft文档描述了使用when
关键字来表达泛型类型参数Constraints (F#)的约束。
另请参阅此Microsoft文档,该文档描述了在各种设置Pattern Matching (F#)中与when
关键字匹配的模式。
模式匹配文档说明以下几个例子。
模式是转换输入数据的规则。他们被使用 整个F#语言将数据与逻辑结构进行比较或 结构,将数据分解为组成部分或提取 来自各种方式的数据信息。
匹配表达式文档说明以下内容以及示例。
您可以使用when子句指定其他条件 变量必须满足匹配模式。提到这样的条款 作为一名警卫。不评估when关键字后面的表达式 除非与该警卫相关的模式匹配。