请解释一下这种语法

时间:2016-04-03 22:43:54

标签: f#

关于如何调用隐式转换运算符的answer by kvb

let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)

我已经知道F#了一段时间,但我不知道如何解析这里的实现。什么是(^a or ^b)?之后的东西?请仔细阅读每个部分用语法表达的内容。

1 个答案:

答案 0 :(得分:7)

^a or ^b字面意思是" ^a^b"。

冒号:表示"有"或者"包含在"中,取决于你如何看待它。

所以整个表达式(^a or ^b) : (static member op_Implicit : ^a -> ^b)表示"静态成员名为" op_Implicit"类型为^a -> ^b且类型为^a或类型^b"的人员。整个表达式最终评估为^a -> ^b类型的函数。

然后,位于该表达式右侧的x表示"函数应用程序",就像通常的F#语法一样。

所以整个事情在一起意味着"在类型^a或类型^b上,找到一个名为" op_Implicit"的静态成员。类型为^a -> ^b的类型,并将该成员应用于参数x"。

有关静态解析约束的更多讨论,请参阅this answerthis MSDN article