寻找有关内联函数的静态解析类型参数的信息,我偶然发现了FSharp.Core 中各种原始运算符的定义:
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))
Run Code Online (Sandbox Code Playgroud)
从上面的代码片段中可以看出,when关键字的使用格式为:when expr1 = expr2适用于各种内置类型.我猜这是某种编译器相当于"如果T = int使用opcode add.ovf,否则如果......,否则就这样做".
但是,我在F#文档中找不到这种语法的单一参考/解释.有一些F#内部知识的人可以解释上面那个片段中发生了什么吗?
用户卡斯滕对此答案提供了以下评论,因为他认为这是错误的。
事情是:
when这里按原样使用与记录的用法无关 - 它似乎被称为静态条件优化,不应该在核心库之外使用 - 实际上继续并尝试使用它 - 你会发现你不能除非你使用约翰斯回答(其他问题)中提到的技巧
用户 Carsten 对此答案添加了附加评论:
我添加了一条评论 - 我认为我的有根据的猜测不值得回答 - 我希望一位内部人士最终能给出一个正式的答案
Carsten 的第一条评论中提到的答案是用户 John Palmer 在 2013 年 4 月提出的,该答案链接到他提供的关于(# ..... #)语法的答案,What is the (# ... #) 语法在 F3 标准库实现中看到?
您实际上可以使用它,但您必须 在代码中指定
--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 文档,该文档描述了when各种设置中与关键字进行模式匹配的模式匹配 (F#)。
模式匹配文档说明了以下内容以及几个示例。
模式是转换输入数据的规则。它们在整个 F# 语言中用于将数据与一个或多个逻辑结构进行比较、将数据分解为组成部分或以各种方式从数据中提取信息。
匹配表达式文档说明了以下内容以及示例。
您可以使用when 子句来指定变量必须满足才能匹配模式的附加条件。这样的子句称为保护子句。除非与与该防护关联的模式匹配,否则不会评估when关键字后面的表达式。