F# 静态类型变量、成员约束、编译器错误?(“试图将其作为操作员名称进行分析,但失败”
汇编:F# 静态类型变量、成员约束、编译器错误?(“试图将其作为操作员名称进行分析,但失败”,f#,inline,f#-3.0,F#,Inline,F# 3.0,汇编: let inline f< ^T when ^T : (static member (<<<) : ^T * int -> ^T) > (x : ^T) = x <<< 1 当^T:(静态成员():^T*int->^T)>(x:^T)=x>>1时,让内联f”。应为“)”或其他标记 类型参数缺少约束“^T:(静态成员(>>):^T*int32->^T)”时 添加空格没有帮助;此行产生相同的编译器错误: let inline f<
let inline f< ^T when ^T : (static member (<<<) : ^T * int -> ^T) > (x : ^T) = x <<< 1
当^T:(静态成员():^T*int->^T)>(x:^T)=x>>1时,让内联f<^T
错误:
let inline f< ^T when ^T : (static member ( >>> ) : ^T * int -> ^T) > (x : ^T) = x >>> 1
当^T:(静态成员(>>):^T*int->^T)>(x:^T)=x>>>1时,让内联f<^T
我已经搜索了文档和规范,但没有结果。这是虫子吗?是否有办法在成员签名中包含
字符?看起来确实像个bug。这很难看,但一种解决方法是使用运算符名称的长形式:
let inline f< ^T when ^T : (static member op_RightShift : ^T * int -> ^T)> (x : ^T) =
x >>> 1
当^T:(静态成员op_RightShift:^T*int->^T)>(x:^T)时,让内联f<^T=
x>>>1
您甚至需要显式约束吗?这同样有效:
let inline f (x: ^T) : ^T = x >>> 1
看起来像个虫子…啊,谢谢。我以为我试过了,但没有成功,但显然还有其他错误,因为这很好用。@phoog-你可能用了
op\u greater
,但实际上不能象征性地使用。不,我肯定用了op\u RightShift,编译器似乎无法识别带有该约束的>
。也许我输入了op_LeftShift
而不是op_RightShift
,或者其他什么地方出错了。是的,谢谢你的回答;我忘了在问题中包括那个。事实上,这是一个更早、更长版本的问题,但我决定在发帖前尽量简短。我确实有理由使用显式约束。我不记得那是什么,确切地说;最后,我决定以完全不同的方式解决我的问题。问题是编写代码,将IEEE single或IEEE double一般分解为符号、指数和尾数部分;现在我只使用一个类型别名,可以根据需要进行更改。稍后我可能会回到通用方法。
let inline f (x: ^T) : ^T = x >>> 1