关于如何调用隐式转换运算符的answer by kvb:
let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x)
我已经知道F#了一段时间,但我不知道如何解析这里的实现。什么是(^a or ^b)
?之后的东西?请仔细阅读每个部分用语法表达的内容。
答案 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 answer或this MSDN article。