c,java和许多其他语言不注意返回值.
int i = func()
float f = func()
int func() { return 5 }
float func() { return 1.3}
Run Code Online (Sandbox Code Playgroud)
为什么以上不合法?它是否使编程更加困难
int i = func(func(func(func2(func3())))) //you dont know what you are getting
Run Code Online (Sandbox Code Playgroud)
编写编译器难吗?还有更多语言的歧义吗?有没有一种语言可以做到这一点?
Her*_*rms 17
这个案子怎么样?
class A implements Foo { /*...*/ }
class B implements Foo { /*...*/ }
A func() { return new A(); }
B func() { return new B(); }
Foo v = func(); // which do you call?!
Run Code Online (Sandbox Code Playgroud)
当允许重载具有不同参数的单个函数名时,已存在歧义问题.必须检查返回类型可能会使解决正确的功能更加困难.
我确信一种语言可以实现这一点,但它会使事情变得更复杂,并且通常会使代码更难理解.
Fre*_*örk 14
让我们说这是允许的,这可以称之为:
func();
Run Code Online (Sandbox Code Playgroud)
这可能不是完整的答案,但我认为这是它不合法的一个原因.
jmg*_*jmg 10
是的,允许在返回类型上重载会使语言复杂化.它使重载标识符(例如函数名称)的解析变得复杂.但这并非不可能,例如Haskell允许根据其返回类型重载函数.
class Num a where
fromInteger :: Integer -> a
...
Run Code Online (Sandbox Code Playgroud)
Num是Haskell中的一个类型类,它有一个被调用的方法fromInteger,它是一个从任意大小Integer到任意类型的函数,它具有一个实例Num.Haskell类型类机制与面向对象语言的类概念有很大不同.因此我的解释可能听起来很奇怪
但是,结果是我可以使用fromInteger函数,并且根据调用上下文,在编译时选择不同的实现.
对类型系统进行了全面的研究,使这一特性成为可能.因此,我认为它在静态类型语言中是可行的.动态类型语言要么需要时间旅行,要么需要一些聪明的想法.
避免歧义.
a( int )
a( bool )
int b()
bool b()
a( b() ) -- Which b?
Run Code Online (Sandbox Code Playgroud)
这里类型推断具有循环依赖性.这b取决于哪个a,但a取决于哪个b,所以它会卡住.
禁止返回类型的重载可确保类型推断是非循环的.返回类型始终可以由参数类型确定,但参数类型不能由返回类型确定,因为它们可能又由您尝试查找的参数类型确定.
对于C++示例,请考虑:
void g(int x);
void g(float x);
g(func());
Run Code Online (Sandbox Code Playgroud)
g()将调用哪些重载函数?