2014-01-15 51 views
3

好吧,对不起的标题感到抱歉。F#的语法解释(^)

考虑以下功能:

let inline getName arg = 
    (^a : (member Name : string) arg) 

我知道它做什么,但我知道那只是因为我复制粘贴它。

它说:给出arg返回argname成员。

但是我不明白的第一部分^a,也不是我得到的: (member Name : string)

我所知道的是,最后的arg正在应用^a : (member Name : string)函数的arg的值。

回答

9

^用于指定type parameter is statically resolved,这意味着类型将在编译时解析,而不是在运行时解析。

第二部分是generic constraint,它指定该类型必须具有名为Name的成员,并带有给定的签名,在此例中为字符串属性。告诉你的语法是如何实际调用成员和编译器推断在功能上通用约束,但你也可以明确地指定约束,但也没有必要。

let inline getName (arg : ^a when ^a : (member Name : string)) = 
    (^a : (member Name : string) arg) 
+1

要清楚:'^ a:(member Name:string)'基本上是一个函数,它返回参数'arg'的Name成员? – mydogisbox