11

我正在尝试使用显式类型参数和约束来定义运算符:

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

它在 F# 2.0 中运行良好,但会产生:

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

那么,为运算符定义做显式类型参数规范的正确方法是什么?

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

4

2 回答 2

13

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

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
于 2010-08-17T13:09:20.930 回答
4
let inline (===) (a : 'TA when 'TA : not struct) (b : 'TB when 'TB : not struct) = 
    obj.ReferenceEquals (a,b)
于 2010-08-17T11:04:47.480 回答