在F#中,具有不同arity和return类型的两个函数可以共享一个名称吗?

时间:2015-09-24 12:00:58

标签: types f# overloading

在F#中,具有不同arity和return类型的两个函数可以共享一个名称吗?

例如,使用2个参数,f会返回int

let f (x:int) (y:int) : int = x + y

但是有3个参数,f会返回bool

let f (x:bool) (y:bool) (z:bool) : bool = x & y & z

似乎返回类型应该可以通过给定的参数数来推断,但是我得到了编译错误:

  

重复定义价值' f'

这是F#的限制吗?

1 个答案:

答案 0 :(得分:4)

让我们分析两个特征:

  • 不同的退货类型:

这在F#中并不像其他函数式语言那样微不足道,但它有可能并且在某些时候它们是有意义的。典型的例子是数学运算符,它们根据输入参数类型返回不同的类型,因此最终你拥有的是一个通用函数。这与方法重载的想法不同,其中有许多共享名称的方法。

  • 不同数量的参数:

这在其他具有自动currying功能的语言中也更为微不足道,因为它会与该功能发生冲突。仍有一些(很少)案例可能有意义,here's an example coming from Haskell

  • 两个同时:

这实际上没有意义,重载函数背后的想法是在不同重载的输入(也可能是输出)参数的类型之间建立关系,这些参数将被视为单个泛型函数。 因此,在这种情况下,它类似于更多的.NET方法重载,顺便说一下,这是F#支持的功能。

最后,使用一些黑客你可以用F#编码你的例子:

$http({
           method: "POST",
           url: scope.serviceBase + 'api/Property/PostAsync',
           headers: {
                       'Content-Type': "application/x-www-form-urlencoded"
                    },
           data: data,
           transformRequest: []
           }).success(function (response) {
               alert(response);
           }).error(function (response) {
               alert(response);
           });

但是,我认为这不是一个好主意。