在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