2010-08-17 83 views
10

我试图用显式类型参数和约束定义运营商明确的类型参数:F#:在运营商捆绑

let inline (===)<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

它运作良好,在F#2.0,但产生的:

警告FS1189:
类型参数必须直接放置在类型名称旁边的 ,例如“型 Ç<“T>”,而不是键入“C <” T>”

那么,什么是为运营商定义做明确的类型参数规格的正确方法?

p.s.请不要告诉我关于隐式类型参数和其他一些解决方法,我想具体解决这个问题。

回答

12

编译器中的错误意味着符号运算符永远不会被视为直接与类型参数相邻。您可以通过例如

let inline myeq<'a, 'b 
    when 'a : not struct 
    and 'b : not struct> a b = obj.ReferenceEquals (a,b) 

let inline (===) a b = myeq a b 
+1

另外有源图案具有相同的错误: '让(| SomePatternName |)<'a, 'b> X = x' – ControlFlow 2010-09-01 10:58:41

4
let inline (===) (a : 'TA when 'TA : not struct) (b : 'TB when 'TB : not struct) = 
    obj.ReferenceEquals (a,b) 
+0

良好,但是这不是显式类型参数;) – ControlFlow 2010-08-17 11:25:22