F#:操作符绑定中的显式类型参数

12

我正在尝试使用显式类型参数和限制条件来定义运算符:

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

在F# 2.0中它能很好地工作,但会产生以下警告:FS1189警告:类型参数必须直接放置在类型名称旁边,例如"type C<'T>", 而不是 "type C <'T>"。那么,对于运算符定义,明确的类型参数规范的正确方法是什么呢?附言:请不要告诉我关于隐式类型参数和其他解决方法,我想具体解决这个问题。
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

1
同时,活动模式也存在同样的错误: let (|SomePatternName|)<'a, 'b> x = x - controlflow

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接