为什么这个带有成员约束的F#代码不能编译?

时间:2014-02-25 16:49:24

标签: f# constraints member

对我来说,似乎编译器拥有该点的所有信息,但我收到错误消息。为什么呢?

let inline getLength< ^a when ^a : (member Length : int ) > (x: ^a) = x.Length

1 个答案:

答案 0 :(得分:6)

要调用静态约束所需的成员,您需要使用更复杂的语法:

let inline getLength< ^a when ^a : (member Length : int ) > (x: ^a) = 
  (^a : (member Length : int) x)

这有点难看 - 我认为强调静态成员约束不是实现事物的主要方式(通常,您可以使用例如接口或其他更常用的技术)。

此外,如果您主要对数学代码感兴趣,那么您可以使用标准运算符和函数(以及LanguagePrimitives中的一些原语),您将不必显式调用成员。