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

标签 types f# overloading

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

例如,对于 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

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

Duplicate definition of value 'f'

这是 F# 的限制吗?

最佳答案

让我们分析一下这两个特征:

  • 不同的返回类型:

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

  • 不同数量的参数:

这更不重要,在其他具有自动柯里化(Currying)功能的函数式语言中也是如此,因为它会与该功能发生冲突。仍然有一些(少数)情况下它们可能有意义,here's an example coming from Haskell .

  • 两者同时:

这实际上没有任何意义,重载函数背后的想法是在不同重载的输入(也可能是输出)参数类型之间建立关系,这将感觉像是一个通用函数。 因此,在这种情况下,它更像是 .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

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

关于types - 在 F# 中,具有不同 arity 和返回类型的两个函数可以共享一个名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32760784/

相关文章:

java - jni 不支持类型如 void*、unsigned int*、.... 怎么办?

haskell - 是否可以从 Haskell 中数据类型的可能值生成列表?

f# - 如何使用 F# 中的类型提供程序连接到 SQL Server Compact Edition 4.0?

c++ - 为什么 `std::hash` 不是通过重载为 `std::begin` 的自定义点?

c++ - C++ 中如何进行函数重载决策?

javascript - 编写 .d.ts 文件以便我可以与 JavaScript 和 TypeScript 共享常量?

dll - F# 有自己的字符串操作库吗?

f# - 使用 FParsec 解析自描述输入

使用类指针重载的 C++ 命名空间函数模板特化替代方案?

c# - 为什么 IsAssignableFrom 在将可空值与接口(interface)进行比较时返回 false?