Programming languages 不同编程语言中的重载

Programming languages 不同编程语言中的重载,programming-languages,overloading,Programming Languages,Overloading,有人能解释一下(举例)上下文无关重载和上下文相关重载之间的区别吗?我从来没有听说过这些。谷歌上只有五个点击率,其中一个就是这个问题,我觉得这似乎是虚构的术语。就像任何虚构的术语一样,如果你想知道它的意思,你必须问虚构它的人 据我所知,这似乎与基于返回类型的重载有关 基本上,如果有如下四个重载函数: foo :: string → int foo :: string → string foo :: string → () foo :: int → int 你这样称呼他们: 1 + foo 1 1

有人能解释一下(举例)上下文无关重载和上下文相关重载之间的区别吗?

我从来没有听说过这些。谷歌上只有五个点击率,其中一个就是这个问题,我觉得这似乎是虚构的术语。就像任何虚构的术语一样,如果你想知道它的意思,你必须问虚构它的人

据我所知,这似乎与基于返回类型的重载有关

基本上,如果有如下四个重载函数:

foo :: string → int
foo :: string → string
foo :: string → ()
foo :: int → int
你这样称呼他们:

1 + foo 1
1 + foo "one"
foo "one"
然后,使用上下文相关重载(即基于返回类型和参数类型的重载),将选择以下实现:

1 + foo 1     # foo :: int → int
1 + foo "one" # foo :: string → int (because `+` takes an `int`)
foo "one"     # foo :: string → ()  (because there is no return value)
1 + foo 1     # foo :: int → int
1 + foo "one" # ERROR
foo "one"     # ERROR
而对于上下文无关重载(即忽略返回类型),将选择以下实现:

1 + foo 1     # foo :: int → int
1 + foo "one" # foo :: string → int (because `+` takes an `int`)
foo "one"     # foo :: string → ()  (because there is no return value)
1 + foo 1     # foo :: int → int
1 + foo "one" # ERROR
foo "one"     # ERROR
错误
两种情况下,
foo::string之间都存在歧义→ int
foo::string→ string
foo::string→ ()
,因为它们的返回类型不同,但具有相同的参数类型。

引用自:

有两种类型的重载 功能/操作员

  • 上下文无关-仅对要加载的参数执行重载 函数的函数或操作数类型 接线员
  • 上下文相关-调用哪个抽象也取决于它 结果的类型