F#允许重载函数仅通过可选参数来区分,例如:
type MyClass() =
member this.func(a: string, b:string) = "func(a,b)"
member this.func(a: string, ?b:string) = "func(a,?b)"
你会如何称呼第一个函数?
F#允许重载函数仅通过可选参数来区分,例如:
type MyClass() =
member this.func(a: string, b:string) = "func(a,b)"
member this.func(a: string, ?b:string) = "func(a,?b)"
MyClass().func("A","B")
普通方式调用函数时,您会收到一个有关歧义的错误消息:
由于您可以为可选参数显式提供error FS0041: A unique overload for method 'func' could not be determined based on type information prior to this program point. A type annotation may be needed. Candidates: member MyClass.func : a:string * ?b:string -> string, member MyClass.func : a:string * b:string -> string
Some
值,因此可以通过两种方式显式调用第二个重载(带或不带 ?b
)。MyClass().func("A")
MyClass().func("A",?b=Some "B")
出于好奇,我们发现可以通过静态成员约束调用第一个重载函数。这样做相当丑陋,您可能不应该这样做,但它会调用第一个重载函数:
let inline callFunc (o:^T) a b =
(^T : (member func : string * string -> string) (o, a, b))
callFunc (MyClass()) "A" "B"