FSharp.Core中未记录的`when`关键字用法

20

我在寻找有关内联函数静态解析类型参数的信息时,偶然发现了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))

正如上面的片段中所看到的,when关键字以when expr1 = expr2的格式用于各种内置类型。我猜这是一种编译器等价于“如果T=int使用opcode add.ovf,否则如果…,否则执行”。然而,在F#文档中我找不到任何关于这种语法的参考/解释。有了一些F#内部知识的人能否解释一下上面那个片段中正在发生什么?

2
请注意,在标准的 F# 中,您不能使用此语法(或 (# ... #) 语法)。 - Ramon Snir
5
以下是翻译的内容:这里有一些解释:https://dev59.com/5GQo5IYBdhLWcg3wiv0i#15968212 - John Palmer
1
它似乎被称为静态条件优化,我认为它不应该在核心库之外使用 - 如果您尝试使用它并检查编译器错误,您就可以找出答案 ;) - Random Dev
1个回答

2
用户卡斯滕认为以下答案是错误的,并提供了以下评论:
“关键是:在这里使用when与文档中的用法无关 - 它似乎被称为静态条件优化,不应在核心库之外使用 - 的确,请尝试使用它 - 除非你使用John的答案中提到的技巧,否则你将看到你无法使用它。”
用户卡斯滕还添加了一条评论:
“我添加了一条评论 - 我认为我的猜测并不值得回答 - 我希望周围的内部人员最终会对此做出官方答复。”
卡斯滕第一次评论中提到的答案是由约翰·帕尔默(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文档,其中描述了在各种设置中使用when关键字进行模式匹配:Pattern Matching (F#) 模式匹配文档与多个示例一起说了以下内容:
“模式是用于转换输入数据的规则。 它们在整个F#语言中用于将数据与逻辑结构或结构进行比较,将数据分解成组成部分或以各种方式从数据中提取信息。”
Match Expression文档与一个示例一起说了以下内容。
你可以使用 when 从句来指定一个附加条件,使变量满足该条件才能匹配模式。这样的从句被称为“守卫”。跟在 when 关键字后面的表达式只有当与该守卫关联的模式匹配时才会被求值。

你有足够的声望来查看已删除的问题吗?因为我可以将我的评论复制并粘贴到这里的最后一个问题中...你在这里描述的不是 OP 的问题所发生的情况(实际上,那里的评论已经回答了它)- 你也不应该(仅)发布链接。 - Random Dev
@Carsten,我只看到一个问题和几条评论,其中没有一条似乎回答了OP关于“when”关键字用法的问题,尽管其中一条链接到了有关F#核心中使用的.NET操作码插入的答案,这种用法现在已经相当罕见,不应该再使用。当引用其他文档的相关部分时,链接一直是完全可以接受的。为什么不复制你的评论呢?因为我除了这条评论之外什么都没看到你发表过。 - Richard Chambers
问题是:在这里使用的 when 与文档中的用法无关 - 它似乎被称为 静态条件优化,不应在核心库之外使用 - 实际上,继续尝试使用它 - 你会发现除非你使用约翰答案(其他问题)中提到的技巧,否则你将无法使用它。 - Random Dev
@Carsten,我建议你从中创建一个答案或将其添加到评论中。 - Richard Chambers
我添加了一条评论 - 我不认为我的猜测有回答的价值 - 我希望周围的内部人士之一最终能给出官方答案。 - Random Dev
顺便说一句:如果您只是将其添加到您的答案中,我不介意 - 实际上这可能是个好主意,因为我们最终会有一些答案,也许可以关闭此问题。 - Random Dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接