F#允许重载函数仅由可选参数区分,例如:
type MyClass() =
member this.func(a: string, b:string) = "func(a,b)"
member this.func(a: string, ?b:string) = "func(a,?b)"
Run Code Online (Sandbox Code Playgroud)
你怎么称呼第一个功能?
如果两个重载函数仅由可选参数不同,我认为没有一种合理的方法来调用第一个函数.正如评论中所提到的,使用它可能是一个糟糕的设计,你应该重命名参数.
您可能已经注意到,当您尝试使用普通方式调用该函数时MyClass().func("A","B"),会收到一条错误消息,抱怨该歧义:
错误FS0041:无法根据此程序点之前的类型信息确定方法"func"的唯一重载.可能需要类型注释.候选人:成员MyClass.func:a:string*?b:string - > string,成员MyClass.func:a:string*b:string - > string
您可以通过两种方式(有或没有?b)显式调用第二个重载,这要归功于您可以Some 为可选参数显式提供值:
MyClass().func("A")
MyClass().func("A",?b=Some "B")
Run Code Online (Sandbox Code Playgroud)
出于好奇,事实证明你可以通过静态成员约束调用第一个重载.这非常难看,你可能不应该这样做,但它会调用第一个重载:
let inline callFunc (o:^T) a b =
(^T : (member func : string * string -> string) (o, a, b))
callFunc (MyClass()) "A" "B"
Run Code Online (Sandbox Code Playgroud)