在 F# 中,具有不同 arity 和 return 类型的两个函数可以共享一个名称吗?
In F#, can two functions with different arity and return types share a name?
在 F# 中,具有不同元数和 return 类型的两个函数可以共享一个名称吗?
例如,有 2 个参数,f
returns 一个 int
:
let f (x:int) (y:int) : int = x + y
但是有 3 个参数,f
returns a bool
:
let f (x:bool) (y:bool) (z:bool) : bool = x & y & z
似乎 return 类型 应该 可以通过给定的参数数量推断出来,但我得到了编译错误:
Duplicate definition of value 'f'
这是 F# 的限制吗?
让我们来分析一下这两个特征:
- 不同的return类型:
这在 F# 中并不像在其他函数式语言中那样微不足道,但这是可能的,并且在某些时候它们是有意义的。典型的例子是数学运算符,它们 return 基于输入参数类型的不同类型,所以最终你拥有的是一个通用函数。这与方法重载不同,方法重载有许多共享名称的方法。
- 参数个数不同:
这更不重要,在其他具有自动柯里化功能的函数式语言中也是如此,因为它会与该功能发生冲突。仍然有一些(少数)情况下它们可能有意义,。
- 两者同时:
这实际上没有任何意义,重载函数背后的想法是在不同重载的输入(也可能是输出)参数类型之间建立关系,这将感觉像是一个通用函数。
所以在这种情况下,它更像是 .NET 方法重载,顺便说一句,这是 F# 中支持的功能。
最后,使用一些技巧,您可以在 F# 中对您的示例进行编码:
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
但我还是认为这不是个好主意。
在 F# 中,具有不同元数和 return 类型的两个函数可以共享一个名称吗?
例如,有 2 个参数,f
returns 一个 int
:
let f (x:int) (y:int) : int = x + y
但是有 3 个参数,f
returns a bool
:
let f (x:bool) (y:bool) (z:bool) : bool = x & y & z
似乎 return 类型 应该 可以通过给定的参数数量推断出来,但我得到了编译错误:
Duplicate definition of value 'f'
这是 F# 的限制吗?
让我们来分析一下这两个特征:
- 不同的return类型:
这在 F# 中并不像在其他函数式语言中那样微不足道,但这是可能的,并且在某些时候它们是有意义的。典型的例子是数学运算符,它们 return 基于输入参数类型的不同类型,所以最终你拥有的是一个通用函数。这与方法重载不同,方法重载有许多共享名称的方法。
- 参数个数不同:
这更不重要,在其他具有自动柯里化功能的函数式语言中也是如此,因为它会与该功能发生冲突。仍然有一些(少数)情况下它们可能有意义,
- 两者同时:
这实际上没有任何意义,重载函数背后的想法是在不同重载的输入(也可能是输出)参数类型之间建立关系,这将感觉像是一个通用函数。 所以在这种情况下,它更像是 .NET 方法重载,顺便说一句,这是 F# 中支持的功能。
最后,使用一些技巧,您可以在 F# 中对您的示例进行编码:
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
但我还是认为这不是个好主意。