F#op#U等式不同类型

F#op#U等式不同类型,f#,type-inference,f#-3.0,F#,Type Inference,F# 3.0,我正在尝试重写(=),以便能够将新定义的类型与int进行比较。我希望实现以下目标: type T = T with static member op_Equality (_ : T, c : int) = true let b = T = 2 // Error: This expression was expected to // have type T but here has type int 我可以很容易地让它在C#中工作,但在F中却做不到# 我也试过了

我正在尝试重写(=),以便能够将新定义的类型与int进行比较。我希望实现以下目标:

type T = T with static member op_Equality (_ : T, c : int) = true

let b = T = 2 // Error: This expression was expected to
              // have type T but here has type int
我可以很容易地让它在C#中工作,但在F中却做不到#

我也试过了

  • 创建静态成员(+),但它给我一个警告,并且不起作用
  • 将CustomEqualityAttribute添加到T-也不起作用

我想知道是否有可能让(=)运算符使用两种不同的类型?

标准的
=
运算符假定两个参数都具有相同的类型,因此我认为无法添加适用于不同类型的重载。我认为一个明智的选择可能是定义一对运算符
=
=.
(类似的运算符,例如
*
*.
通常分别用于标量乘法和左右标量):

但是,当用户想要比较两个不同类型的值时,最好直接要求用户编写
a.N=y
(因为严格来说,同一类型的两个值永远不可能相等-它们甚至不是同一类型!)

如果确实需要,可以重新定义
=
运算符,但我不建议这样做(而且,当您使用
let
定义运算符
(=)
时,编译器会向您发出警告,说明通常不建议这样做)。无论如何,可以使用以下方法完成:

类型Foo(n:int)=
成员x.N=N
//包含“=”的所有重载的类型
//您要支持的操作员
类型相等=相等于
静态成员(?注意:这不是前面问题的重复。这里,OP询问定义两个不同类型之间的相等性(前面的问题询问相同类型的两个值)。
type Foo(n:int) = 
  member x.N = n
  static member (=.) (x:Foo, y:int) = x.N = y
  static member (.=) (y:Foo, x:int) = x.N = y
type Foo(n:int) =
  member x.N = n

// A type that contains all overloads of the `=` 
// operator that you want to support
type Equality = EQ with    
  static member (?<-) (_:Equality, x:int, y:int) = x = y
  static member (?<-) (_:Equality, x:float, y:float) = x = y
  static member (?<-) (_:Equality, x:Foo, y:int) = x.N = y

// This hides the standard equality operator and can 
// lead to all sorts of confusion! (Probably do not do this :-))
let inline (=) x y = (?<-) EQ x y

10 = 4
Foo(10) = 3