gpt4 book ai didi

f# - 区分带有可选参数的 f# 重载函数

转载 作者:行者123 更新时间:2023-12-04 11:20:06 25 4
gpt4 key购买 nike

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



由于您可以显式提供 ?b,您可以通过两种方式(有或没有 Some)显式调用第二个重载。可选参数的值:
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"

关于f# - 区分带有可选参数的 f# 重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43360451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com