我正在尝试使用显式类型参数和约束来定义运算符:
let inline (===)<'a, 'b
when 'a : not struct
and 'b : not struct> a b = obj.ReferenceEquals (a,b)
它在F#2.0中运行良好,但产生:
警告FS1189:
类型参数必须直接放置 与类型名称相邻,例如“类型 C&lt;'T&gt;“,而不是类型”C&lt;'T&gt;“
那么为运算符定义执行显式类型参数规范的正确方法是什么?
P.S。请不要告诉我隐式类型参数和其他一些解决方法,我想具体解决这个问题。
答案 0 :(得分: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 :(得分:4)
let inline (===) (a : 'TA when 'TA : not struct) (b : 'TB when 'TB : not struct) =
obj.ReferenceEquals (a,b)