3

它只存在于静态类型语言中吗?只有当语言不是强类型时才存在(即,Java 有强类型)吗?此外,它属于哪里 - 在编译阶段假设它是一种编译语言?

一般来说,当类型不明确时,规则是由语言规范规定还是由实现决定?

4

4 回答 4

5

类型推断是一些静态类型语言的特性。它由编译器完成,以将类型分配给否则缺少任何类型注释的实体。编译器实际上只是代表程序员“填写”静态类型信息。

类型推断在具有许多隐式强制和歧义的语言中往往效果较差,因此大多数类型推断语言都是函数式语言,几乎没有强制、重载等方式。

类型推断是语言规范的一部分,例如 F# 规范详细介绍了类型推断算法和规则,因为这有效地确定了“什么是合法程序”。

尽管某些(大多数?)语言支持某些有限形式的类型推断(例如 C# 中的“var”),但在大多数情况下,人们使用“类型推断”来指代绝大多数类型是推断而不是显式推断的语言(例如在 F# 中,除了局部变量之外,通常还会推断函数和方法签名;与 C# 相反,C# 中的“var”允许推断局部变量,但方法声明需要完整的类型信息)。

于 2009-03-28T03:20:18.263 回答
2

类型推断器根据上下文确定变量的类型。它依赖于强类型来做到这一点。例如,函数式语言是非常强的静态类型的,但完全依赖于类型推断。

C# 和 VB.Net 是具有类型推断的静态类型语言的其他示例(它们提供它以使泛型可用,并且它是 LINQ 中的查询所必需的,特别是支持投影)。

动态语言不推断类型,它是在运行时发现的。

于 2009-03-28T03:11:02.183 回答
0

类型推断是一些静态语言中的一种折衷方案。您可以在不指定类型的情况下声明变量,前提是可以在编译时推断类型。它不提供潜在输入的灵活性,但您确实获得了类型安全,并且您不必编写那么多。

请参阅维基百科文章

于 2009-03-28T03:12:39.560 回答
0

类型推断器是使用类型推断算法静态推断类型的任何东西。因此,它不仅仅是静态语言的一个特性。

您可以为动态语言或具有不安全或隐式类型转换的语言构建静态分析工具,类型推断将是其工作的主要部分。但是,对于具有不安全或动态类型系统或包含隐式转换的语言的类型推断,在一般情况下不能用于证明程序的类型安全。

因此使用了类型推断:

  • 避免静态语言中的类型注释,
  • 优化动态语言的编译器(即 Scheme、Self 和 Python),
  • 用于动态语言的错误检查工具、编译器和安全分析。
于 2009-08-09T13:18:11.607 回答