F#:使用重载成员实现接口

F#:使用重载成员实现接口,f#,F#,我用重载方法在F#中定义了一个接口。根据编译器请求,重载使用元组参数而不是当前参数: type IInterface = abstract member Do : (int * string) -> unit abstract member Do : int -> unit 然后,我创建一个实现接口的类: type ImplementingClass = interface IInterface with member this.Do (i,

我用重载方法在F#中定义了一个接口。根据编译器请求,重载使用元组参数而不是当前参数:

type IInterface =
    abstract member Do : (int * string) -> unit
    abstract member Do : int -> unit
然后,我创建一个实现接口的类:

type ImplementingClass =
    interface IInterface with
        member this.Do (i, s) = ()
        member this.Do i = ()
但是,这样做会导致两个方法中的第一个方法的编译器错误:“此重写会将不同数量的参数传递给相应的抽象成员”


我做错了什么?

以下两者之间有细微的区别:

abstract member Do : int * string -> unit
abstract member Do : (int * string) -> unit
如果添加括号,则表示该参数是一个元组,编译器应生成一个采用
tuple
的方法。如果没有括号,该方法将被编译为使用两个参数。大多数时候,这是隐藏的,你可以忽略它-但不幸的是,并不总是

因此,您可以将接口定义更改为使用普通的“双参数”方法(这是我的首选方法-您仍然可以使用tuple作为参数调用该方法,并且在.NET/C#视图中看起来更好):

或者,您可以按原样实现接口:

type ImplementingClass =
    interface IInterface with
        member this.Do((i:int, s:string)) = ()
        member this.Do(i:int) = ()
遗憾的是,这有点难看——您需要类型注释,以便编译器能够明确地确定您要实现的方法

type ImplementingClass =
    interface IInterface with
        member this.Do((i:int, s:string)) = ()
        member this.Do(i:int) = ()