我有一个简单的问题,为什么Scala编译器无法自行推断函数参数类型?在斯卡拉,为什么类型注释必须遵循函数参数?为什么编译器不能推断函数参数类型?
回答
一些函数式编程语言,比如Haskell,可以推断几乎 所有类型的,因为他们可以进行全局类型推断。斯卡拉不能 这样做,部分原因是因为斯卡拉必须支持子类型多态性 (继承),这使得类型推断困难得多。这里有一个 Scala中需要显式类型注释的规则摘要。
时,显式类型注释需要
在实际应用中,你必须为下列情况提供明确的类型注释:
一个可变的VAR或不变VAL声明,你不要指定一个值(例如,像val book这样的类中的抽象声明:String,var count:Int
所有方法参数(例如,def deposit(amount:Money)= {...})。
方法的返回类型在下列情况下:
1)当你显式调用的方法(甚至在结束返回)。
2)当一个方法是递归的。
3)当两个或更多的方法被重载(具有相同的名称)并且其中一个调用另一个时;调用方法需要返回类型注释。
4)当推断的返回类型比您想要的更通用时,例如Any。
谢谢!这有帮助。 –
我有一个简单的问题,为什么是Scala编译器不能够通过自身来推断函数参数类型?
斯卡拉有本地类型推断。如果你看看这个方法,并且看看本地有什么信息,那么应该很容易看出,简单地说没有关于这些类型可能的信息。
说,你有以下方法:
def foo(a) = a + a
如何斯卡拉要弄清楚a
是什么类型的?它只能从图中看出的方法是如何调用的,但这是非本地的信息!
而且更糟的是:由于Scala支持动态代码加载,所以在编译时调用代码甚至可能不存在。
- 1. 为什么斯卡拉不能推断方法参数的类型
- 2. 为什么scala编译器不能从超类中推断出类型参数?
- 3. 斯卡拉 - 推断类型参数
- 4. 为什么不能为嵌套函数推断类型
- 5. 斯卡拉2.8:匿名函数类型推断为默认参数
- 6. 泛型函数参数类型推断
- 7. 为什么不能推断这些类型的参数?
- 8. 为什么通用方法不能推断参数类型?
- 9. 为什么不能推断委托参数的类型?
- 10. 为什么javac不能推断用作参数的函数的泛型类型参数?
- 11. 使用类型参数的类型参数作为斯卡拉
- 12. 为什么编译器不能推断泛型类型
- 13. 斯卡拉类型参数
- 14. 为什么C++编译器不能推断模板参数?
- 15. 为什么方法类型推断无法推断出类型参数?
- 16. 为什么Scala不会推断特征类型参数?
- 17. 为什么不能模板非类型参数是类类型
- 18. 斯卡拉未能推断出正确的类型参数
- 19. 为什么这个Haskell函数推断为这种类型?
- 20. 为什么Scala不能在类型参数嵌套时完全推断类型参数?
- 21. 为什么我们必须提供boost :: get的参数类型?
- 22. 为什么类型参数必须重复两次?
- 23. 为什么非默认参数不能遵循默认参数?
- 24. 斯卡拉宏注释 - 具有类型参数的案例类
- 25. 为什么这种类型不能分配给参数类型?
- 26. 如果参数类型为“const int”,那么为什么不能编译tr1 :: bind
- 27. 为什么编译器会为我的泛型函数参数抱怨“不兼容的类型”?
- 28. C#:为什么泛型类型推断工作时有多个类型参数?
- 29. 什么是参数的类型,这个函数做什么?
- 30. 为什么size_t类型的函数参数?
你的问题太广泛了。请尝试给出一个更精确的案例,并附上具体的例子。 –