2
对我来说,似乎编译器具有该点的所有信息,但我收到错误消息。为什么?为什么这个带有成员约束的F#代码不能编译?
let inline getLength< ^a when ^a : (member Length : int) > (x: ^a) = x.Length
对我来说,似乎编译器具有该点的所有信息,但我收到错误消息。为什么?为什么这个带有成员约束的F#代码不能编译?
let inline getLength< ^a when ^a : (member Length : int) > (x: ^a) = x.Length
要调用由静态约束所需的一员,你需要使用一个更复杂的语法:
let inline getLength< ^a when ^a : (member Length : int) > (x: ^a) =
(^a : (member Length : int) x)
这是一个有点难看 - 我想强调的是静态成员约束点不是实现事物的主要方式(通常,您可以使用接口或其他更常用的技术)。另外,如果您主要对数学代码感兴趣,那么您可以只使用标准的运算符和函数(与LanguagePrimitives
中的几个基元一起),并且不必显式调用成员。
所以我必须使用约束调用表达式每次我想访问约束中指定的成员? – ironic
是的,先验你。虽然,我想你是在一个数组上调用长度?在这一点上,你可以写'let getLength(x:'a array)= x.Length' –
@ironic - 是的,但是一旦你定义了'getLength',你就可以使用这个函数来获取长度其他函数),约束将自动传播。但我认为@DanielFabian其实就在这里,你可能只是想要一个简单的数组:-) –