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

F# FSharp.Core中未记录的`when`关键字用法,f#,F#,在查找有关内联函数静态解析类型参数的信息时,我偶然发现了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

在查找有关内联函数静态解析类型参数的信息时,我偶然发现了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))
让内联(+)(x:^T)(y:^U):^V=
检查附加动态x y
当^T:int32和^U:int32=(#“add.ovf”x y:int32#)时
当^T:float和^U:float=(#“添加”x y:float#)时
// 
当^T:^T=(^T或^U):(静态成员(+):^T*^U->^V)(x,y))
从上面的代码片段中可以看出,当expr1=expr2用于各种内置类型时,关键字的格式为:
when-expr1=expr2
。我猜这是一种类似于“if T=int使用操作码add.ovf,else if…,else那样做”的编译器


然而,我在F#文档中找不到对这种语法的任何引用/解释。有人对F#有一些内部知识,能解释一下上面的片段中发生了什么吗?

用户卡斯滕对此答案给出了以下评论,因为他认为这是错误的


问题是:
在这里按原样使用时,与
文档化的用法-它似乎被称为静态条件 优化,不应在核心库之外使用- 事实上,继续尝试使用它——你会发现除非 你使用约翰回答中提到的技巧(其他问题)

用户Carsten对此答案添加了一条附加注释:


我加了一条评论——我认为我的猜测不值得回答 -我希望闲逛的一位知情人士最终能给出一个正式的答案

Carsten的第一条评论中提到的答案是由用户John Palmer于2013年4月提供的,该答案链接到他在
(#…#)语法上提供的答案

您实际上可以使用它,但必须指定
--编译代码中的fslib
(未记录)和
--独立
标志

用户MisterMetaphor提供了一个答案,引用了论坛上的一篇帖子,其中写道:

在F#代码中嵌入IL。该功能是否得到官方支持

不是真的。此功能的99.9%用于操作 在FSharp.Core.dll中定义(在1.9.2.9及之前的版本中称为fslib.dll)

有关
when
关键字的其他用法,请参见以下内容

本Microsoft文档介绍了使用
when
关键字获取匹配的附加条件

本Microsoft文档介绍了使用
when
关键字表示泛型类型参数的约束

另请参阅此Microsoft文档,该文档描述了在各种设置下使用
when
关键字进行模式匹配

模式匹配文档说明了以下内容以及几个示例

模式是转换输入数据的规则。它们被使用 在整个F#语言中,将数据与逻辑结构或 结构、将数据分解为组成部分或提取 以各种方式从数据中获取信息

Match Expression文档说明了以下内容以及一个示例

可以使用when子句指定 变量必须满足才能匹配模式。这一条款被提及 作为守卫。不计算when关键字后面的表达式 除非与该防护装置相关的图案匹配


请注意,您不能在标准F#中使用此语法(或
(#…#)
语法)。以下是一些解释:它似乎被称为静态条件优化,我认为它不应该在核心库之外使用-您可以找出是否尝试使用它并检查编译器错误;)您是否有足够的代表查看已删除的问题?因为我可以复制并粘贴我的评论到最后一个。。。你在这里描述的并不是OPs问题中发生的事情(事实上,那里的评论已经回答了这个问题)——你也不应该(只)发表文章links@Carsten,我只看到一个问题,一些评论,尽管有人链接到了关于F#core中使用的.NET操作码插入的答案,但这些答案似乎都没有回答OP关于
when
关键字用法的问题,这种用法现在非常罕见,不应该在其他情况下使用。当指向其他文档时,只要引用了相关章节,链接总是完全可以接受的。你为什么不复制你的评论,因为除了这条评论,我什么也看不到。问题是:
当这里使用的时候,与文档中的用法没有任何关系-它似乎被称为静态条件优化,不应该在核心库之外使用-确实,继续尝试使用它-你会发现你不能除非你使用Johns answer(other question)@Carsten中提到的技巧,否则我建议你从中创建一个答案,或者将其添加到评论中。我添加了一条评论——我认为我有根据的猜测不值得一个答案——我希望周围的一位知情人士最终会给出正式答案