好吧,抱歉这个糟糕的头衔。
考虑以下功能:
let inline getName arg =
( ^a : (member Name : string) arg)
我知道它的作用,但我知道这只是因为我复制粘贴它。
它说:给arg
name
成员arg
。
但是,我没有得到第一部分^a
,也没有得到: (member Name : string)
。
我所知道的是,最后一个arg
正在应用arg
函数的^a : (member Name : string)
值。
答案 0 :(得分:9)
^
用于指定type parameter is statically resolved,这意味着该类型将在编译时解析,而不是在运行时解析。
第二部分是generic constraint,它指定该类型必须具有名为Name
的成员,并且具有给定的签名,在本例中为字符串属性。您展示的语法是如何实际调用该成员,并且编译器正在推断该函数的泛型约束,但您也可以明确指定约束,尽管没有必要。
let inline getName (arg : ^a when ^a : (member Name : string)) =
( ^a : (member Name : string) arg)