在FSharp.Core中没有记载`when`关键字用法

时间:2014-10-16 14:16:08

标签: f#

查找有关内联函数的静态解析类型参数的信息我偶然发现了FSharp.Core中various primitive operators的定义:

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使用操作码add.ovf,否则如果......,否则就这样做。”

但是,我在F#文档中找不到这种语法的单一参考/解释。有一些F#内部知识的人可以解释上面那个片段中发生了什么吗?

1 个答案:

答案 0 :(得分:2)

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

  

事情是:when按原样使用,与此无关   记录的用法 - 它似乎被称为静态条件   优化,不应该在核心库之外使用 -   确实继续尝试使用它 - 你会看到你不能除非   你使用约翰斯答案中提到的技巧(其他问题)

用户Carsten在此答案中添加了一条评论:

  

我添加了评论 - 我不认为我受过教育的猜测值得回答    - 我希望其中一个内部人员能够最终对其进行正式回答

Carsten的第一条评论中提到的答案是用户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文档,该文档描述了在各种设置Pattern Matching (F#)中与when关键字匹配的模式。

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

  

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

匹配表达式文档说明以下内容以及示例。

  

您可以使用when子句指定其他条件   变量必须满足匹配模式。提到这样的条款   作为一名警卫。不评估when关键字后面的表达式   除非与该警卫相关的模式匹配。