【问题标题】:In F#, can two functions with different arity and return types share a name?在 F# 中,具有不同 arity 和返回类型的两个函数可以共享一个名称吗?
【发布时间】:2015-09-25 17:56:28
【问题描述】:

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

例如,对于 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# 的限制吗?

【问题讨论】:

  • 您可以对成员执行此操作,但请注意 f 1 的类型不明确,这可能是个问题
  • 向所有参数添加显式类型
  • 这是一个限制 - 模块中的函数需要有不同的名称

标签: types f# overloading


【解决方案1】:

让我们分析这两个特征:

  • 不同的返回类型:

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

  • 不同数量的参数:

这更简单,在其他具有自动柯里化的函数式语言中也是如此,因为它会与该特性发生冲突。仍然有一些(少数)案例可能有意义,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

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

【讨论】:

  • 是的,我同意这不是一个好主意,我只是想知道这是否可能。
猜你喜欢
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2013-07-05
  • 2019-04-15
相关资源
最近更新 更多