首页 文章

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

提问于
浏览
20

寻找有关内联函数的静态解析类型参数的信息,我偶然发现了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 ,用于各种内置类型 . 我猜这是某种编译器相当于"if T=int use opcode add.ovf, else if ..., else do that" .

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

1 回答

  • 2

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

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

    用户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文档,该文档描述了在各种设置中与 when 关键字匹配的模式,Pattern Matching (F#) .

    模式匹配文档说明以下几个示例 .

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

    匹配表达式文档说明以下示例 .

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

相关问题