在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#的限制吗?
答案 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);
});
但是,我认为这不是一个好主意。