在FSharp.Core中未记录`when'关键字的使用情况

寻找有关内联函数的静态解析类型参数的信息我偶然发现了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 for various built-in types。 我猜这是某种编译器等价的“如果T = int使用操作码add.ovf,否则如果...,否则做”。

但是,我无法在F#文档中找到对这种语法的单一参考/解释。 是否有一些熟悉F#的人可以解释上面代码段中发生了什么?


用户Carsten对这个答案提供了以下评论,因为他认为这是错误的。

事情是: when这里使用时,与这些文档中的用法无关 - 它似乎被称为静态条件优化,不应该在核心库之外使用 - 确实继续并尝试使用它 - 您会看到您除非你使用约翰斯提到的技巧回答(其他问题)

用户Carsten为这个答案增加了一个额外的评论:

我添加了一条评论 - 我不认为我的受过教育的猜测值得回答 - 我希望其中一位内部人士最终能够给出正式答案

Carsten的第一条评论中提到的答案是用户John Palmer在2013年4月发布的,该链接指向他在(# ..... #)语法中提供的答案,F3中看到的是什么(#...#)语法标准库实现?

你可以实际使用这个,但是你必须在你的代码中指定--compiling-fslib (未记录)和--standalone标志。

用户MisterMetaphor提供了一个答案引用在一个论坛上的发帖说,以下内容:

在F#代码中嵌入IL。 此功能是否正式支持?

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

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

此Microsoft文档描述了使用when关键字匹配匹配表达式(F#)的其他条件。

此Microsoft文档描述了如何使用when关键字来表示泛型类型参数Constraints(F#)的约束。

另请参阅此Microsoft文档描述与各种设置(模式匹配(F#))中的when关键字匹配的模式。

模式匹配文件说明以下几个例子。

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

“匹配表达式”文档将以下内容与示例一起说明。

您可以使用when子句来指定变量必须满足以匹配模式的附加条件。 这样一个条款被称为警卫。 除非与该警卫关联的模式匹配,否则不会评估when关键字后面的表达式。

链接地址: http://www.djcxy.com/p/80661.html

上一篇: Undocumented `when` keyword usage in FSharp.Core

下一篇: Is there a maximum depth for F# inlined functions?