Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个带有成员约束的F#代码不能编译?_F#_Constraints_Member - Fatal编程技术网

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

为什么这个带有成员约束的F#代码不能编译?,f#,constraints,member,F#,Constraints,Member,对我来说,编译器似乎拥有这一点的所有信息,但我得到了错误消息。为什么? let inline getLength< ^a when ^a : (member Length : int ) > (x: ^a) = x.Length 当^a:(成员长度:int)>(x:^a)=x.Length时,让内联getLength(x:^a)= (^a:(成员长度:int)x) 这有点难看——我认为这强调了一点,即静态成员约束不是实现事情的主要方式(通常,您可以使用接口或其他更常用的技术) 另

对我来说,编译器似乎拥有这一点的所有信息,但我得到了错误消息。为什么?

let inline getLength< ^a when ^a : (member Length : int ) > (x: ^a) = x.Length
当^a:(成员长度:int)>(x:^a)=x.Length时,让内联getLength<^a

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

let inline getLength< ^a when ^a : (member Length : int ) > (x: ^a) = 
  (^a : (member Length : int) x)
当^a:(成员长度:int)>(x:^a)=
(^a:(成员长度:int)x)
这有点难看——我认为这强调了一点,即静态成员约束不是实现事情的主要方式(通常,您可以使用接口或其他更常用的技术)


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

因此,每当我想访问constraint中指定的成员时,我都必须使用constraint调用表达式?是,你天生就是这样。不过,我想您是在数组上调用Length?在这一点上,您可以只编写
让getLength(x:'a array)=x.Length
@讽刺-是的,但一旦定义了
getLength
,您就可以使用此函数(从任何其他函数)获取长度,约束将自动传播。但我认为@DanielFabian实际上就在这里,您可能只需要一个简单的数组:-)谢谢您的评论!事实上我在试弦,但这并不重要。