Types 在F#中,两个具有不同算术性和返回类型的函数是否可以共享一个名称?

Types 在F#中,两个具有不同算术性和返回类型的函数是否可以共享一个名称?,types,f#,overloading,Types,F#,Overloading,在F#中,两个具有不同算术性和返回类型的函数是否可以共享一个名称 例如,对于两个参数,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#的限制吗 让我们分析这两个特性: 不同的退货类型: 这在F

在F#中,两个具有不同算术性和返回类型的函数是否可以共享一个名称

例如,对于两个参数,
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#的限制吗

让我们分析这两个特性:

  • 不同的退货类型:
这在F#和在其他函数式语言中一样不是微不足道的,但这是可能的,而且在某种程度上它们是有意义的。典型的例子是数学运算符,它们根据输入参数类型返回不同的类型,因此最终得到的是单个泛型函数。这与方法重载的思想不同,方法重载中有许多方法共享名称

  • 不同数量的参数:
在其他具有自动咖喱的函数式语言中,这一点甚至更不重要,因为它将与该功能冲突。但仍有一些(少数)案例可能有意义

  • 两者同时进行:
这实际上毫无意义,重载函数背后的思想是在不同重载的输入(可能还有输出)参数类型之间建立一种关系,这种关系可以看作是一个单一的泛型函数。 因此,在这种情况下,它更像.NET方法重载,顺便说一句,这是F#中支持的特性

最后,使用一些技巧,您可以将示例编码为F#:


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

你可以对成员这样做,但是请注意,
f1
有一个不明确的类型,这可能是一个问题向所有参数添加显式类型这是一个限制-模块中的函数需要有不同的名称是的,我同意这不是一个好主意,我只是想知道这是否可行。
let f (x:int) (y:int) : int = x + y
let g (x:bool) (y:bool) (z:bool) : bool = x & y & z

type T = T with
    static member ($) (T, x) = fun y   -> f x y
    static member ($) (T, x) = fun y z -> g x y z

let inline myFunc x y = (T $ x) y

let result1 = myFunc 3 5
let result2 = myFunc true false true