寻找有关内联函数的静态解析类型参数的信息,我偶然发现了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 回答
用户Carsten对此答案提供了以下评论,因为他认为这是错误的 .
用户Carsten对此答案添加了额外评论:
Carsten的第一条评论中提到的答案是用户John Palmer在2013年4月的链接到他在
(# ..... #)
语法上提供的答案,What is the (# ... #) syntax seen in F3 standard library implementation?用户MisterMetaphor提供了一个答案,引用了一个论坛中的帖子说:
有关
when
关键字的其他用法,请参阅以下内容 .此Microsoft文档描述了使用
when
关键字来匹配其他条件Match Expressions (F#) .此Microsoft文档描述了使用
when
关键字来表示泛型类型参数的约束,Constraints (F#) .另请参阅此Microsoft文档,该文档描述了在各种设置中与
when
关键字匹配的模式,Pattern Matching (F#) .模式匹配文档说明以下几个示例 .
匹配表达式文档说明以下示例 .