【问题标题】:Undocumented `when` keyword usage in FSharp.CoreFSharp.Core 中未记录的“when”关键字使用
【发布时间】:2014-10-16 14:16:08
【问题描述】:

在寻找有关内联函数的静态解析类型参数的信息时,我偶然发现了 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))

从上面的 sn-p 中可以看出,when 关键字的使用格式为:when expr1 = expr2 用于各种内置类型。我猜这是某种编译器等价于“if T=int use opcode add.ovf, else if ..., else do that”。

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

【问题讨论】:

  • 请注意,您不能在标准 F# 中使用此语法(或 (# ... #) 语法)。
  • 它似乎被称为静态条件优化,我认为它不应该在核心库之外使用 - 你可以看看你是否尝试使用它并检查编译器错误;)跨度>

标签: f#


【解决方案1】:

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

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

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

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

您可以使用 when 子句指定附加条件,即 变量必须满足才能匹配模式。这样的条款被提及 作为后卫。不计算 when 关键字后面的表达式 除非与该守卫关联的模式匹配。

【讨论】:

  • 您是否有足够的代表来查看已删除的问题?因为我也可以将我的评论复制并粘贴到此处的最后一条……您在此处描述的不是 OPs 问题中发生的事情(实际上那里的 cmets 已经回答了)-您也不应该(仅)发布链接
  • @Carsten,我只看到一个问题,几个 cmets,似乎都没有回答 OP 关于 when 关键字使用的问题,尽管其中一个确实链接到关于 .NET 操作码的答案F# 核心中使用的插入,这种用法现在非常罕见,不应在其他情况下使用。只要引用了相关部分,在指向其他文档时,链接总是完全可以接受的。你为什么不复制你的评论,因为除了这条评论,我什么都没看到。
  • 问题是:when 在这里使用与记录的用法无关 - 它似乎被称为 静态条件优化,不应在核心库 - 确实继续并尝试使用它 - 你会发现你不能,除非你使用约翰回答(其他问题)中提到的技巧
  • @Carsten,我建议您从中创建一个答案,或者然后将其添加到 cmets 中。
  • 我添加了一条评论——我认为我的有根据的猜测不值得回答——我希望闲逛的内部人士中的一位最终会给出官方答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2023-03-31
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多