用可选参数区分f#重载函数

时间:2017-04-12 04:42:27

标签: f#

F#允许重载函数仅由可选参数区分,例如:

type MyClass() = 
    member this.func(a: string, b:string) = "func(a,b)"
    member this.func(a: string, ?b:string) = "func(a,?b)"

你怎么称呼第一个功能?

1 个答案:

答案 0 :(得分:8)

如果两个重载函数仅由可选参数不同,我认为没有一种合理的方法可以调用第一个函数。正如评论中所提到的,使用它可能是一个糟糕的设计,你应该重命名参数。

正如您可能已经注意到的那样,当您尝试使用HttpLoggingInterceptor logger = new HttpLoggingInterceptor(); logger.setLevel(HttpLoggingInterceptor.Level.BODY); long SIZE_OF_CACHE = 10 * 1024 * 1024; // 10 MiB Cache cache = new Cache(new File(mContext.getCacheDir(), "http"), SIZE_OF_CACHE); new OkHttpClient.Builder() .addInterceptor(logger) .addInterceptor(new HeaderInterceptor(u)) .cache(cache) .addNetworkInterceptor(new CacheInterceptor(mContext)) .connectTimeout(Constant.CONNECTTIMEOUT, TimeUnit.SECONDS) .readTimeout(Constant.READTIMEOUT, TimeUnit.SECONDS) .writeTimeout(Constant.WRITETIMEOUT, TimeUnit.SECONDS) .build(); 以普通方式调用该函数时,会收到一条错误消息,抱怨该歧义:

  

错误FS0041:方法' func'的唯一重载无法根据此计划点之前的类型信息确定。可能需要类型注释。候选人:成员MyClass.func:a:string *?b:string - > string,member MyClass.func:a:string * b:string - >串

您可以通过两种方式(使用或不使用MyClass().func("A","B"))显式调用第二个重载,这要归功于您可以为可选参数显式提供?b值:

Some

出于好奇,事实证明你可以通过静态成员约束调用第一个重载。这非常难看,你可能不应该这样做,但它会调用第一个重载:

MyClass().func("A")
MyClass().func("A",?b=Some "B")