为什么编程语言不考虑返回类型而生成方法签名?


11

我使用过许多不基于返回类型生成方法签名的语言。我也曾与一个(也许有一些?)一起工作过。过去没有给我带来麻烦的人(例如here)。为什么编程语言不考虑返回类型而生成方法签名?

更新:我专门指的是编译后的静态类型语言


这是一个毫无根据的猜测,但是我猜想它与编译器实现和/或工具支持的难度有关。
查尔斯·兰伯特

在Haskell中,您可以使用类型类来使返回类型相关的函数成为基本类型。I <3 Haskell:D:D:D
Thomas Eding

Answers:


5

它与类型转换和类型层次结构配合得不好。如果方法有两个版本,其中一个返回类型A,另一个返回类型B,则在以下情况下会遇到麻烦:

  • A或B是彼此的子类型,并且您将返回值分配给作为父类型的子类型。
  • A和B具有共同的超类型,您可以将其分配给这种超类型值。

您可以通过强制转换来解决此问题,但这将需要与重命名功能之一一样多的键入操作。当调用不明确时,您还可以注册一个编译器错误,在这种情况下,用户需要花费类似的精力。


1
我使用的语言在签名中包含返回类型。正如您所指出的,到处投射都不是问题。在您的特定示例中,您无需通过强制转换解决此问题。如果A和B(C的子类型)都具有相同的操作,则应在C中声明它。如果A的返回类型与B的返回类型不同:在大多数情况下,它试图返回C的子类型。在子类型中添加另一个方法以返回该子类型,并实现C语言中的版本,以使用特定的子类型调用该方法。现在,您不必在整个地方投射。
查尔斯·兰伯特

@Charles Lambert:这不是对类A,B或C的操作。这是两个具有相同名称和参数列表的函数,其中一个返回类型A,另一个返回类型B。不仅限于OOP系统,所以我根据通用类型和功能进行了回答。另外,我不理解您的反驳示例打算完成的工作;我需要更多细节来回应它。
jprete 2011年

对于一个示例,评论太短了。pastebin.com/JR39PKs0基本上,在签名中包含返回类型的语言都已经想出了减轻您描述的问题的方法。无论是编码约定,还是只是标准惯例。还要注意的是,您编写的内容很少,可以保证创建仅在返回类型上有所不同的方法。再次重申,您不会经常遇到这种情况
Charles Lambert

是否有一个规则很难为任何给定的参数签名声明一个“主”方法,但是可以声明任意数量的辅助方法,并且编译器应通过首先确定一个参数签名来执行重载,这将有困难吗?主要方法存在,然后按指定的顺序检查次要方法,以查看是否有任何这样的方法无疑是更好的匹配项(即使主要方法不是,也可以使用)?
supercat

3

因为您可以调用方法而不分配结果。


3
并非每种语言都可以。
约尔格W¯¯米塔格

@Jorg喜欢哪种语言?
Chiron

1
f#是一种语言。您通常会看到foo-> ignore,其中ignore是具有单位返回类型的方法,类似于void
Charles Lambert

Ada是一个更好的例子。该语言实际上也将返回类型用作签名的一部分。
查尔斯·兰伯特

-4

经验法则:强类型语言通常将方法签名绑定到返回类型。弱类型语言则不会。
我不了解C#,但是我认为问题可能是由于C#处理泛型的方式引起的。可能会为通用方法创建一种完全不同的方法,在这种情况下,它们实际上是两种不同的方法。


1
我很好奇您指的是哪种强类型语言?我什么都不知道,我知道C ++明确禁止对返回类型进行解析。
greyfade

2
-1如果对于一个违反它的示例给出一个表面上看错的经验法则,则应遵循遵循该规则的所有其他示例。

@greyfade,我的意思是在弱类型语言中,在编译时不检查分配。同意,这可能与这里无关。
CMR

你的观点被你不正确的断言所掩盖,即“强类型语言通常将...绑定到返回类型”。
greyfade11年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.