【发布时间】:2011-12-30 20:55:52
【问题描述】:
首先,让我们假设本地类型推断是 Scala 和 C# 中的类型推断。 Scala 本地类型推断在这里解释:http://www.scala-lang.org/node/127
另外,让我们假设,一个定义如
fact 0 = 1
fact n = n * fact(n-1)
将算作本地类型推断——也就是说,这里的类型推断是函数事实的本地。 Scala 不允许这样的类型推断;还是让我们把它算作本地吧。
那么,问题是,是否有人有至少 2 个相互递归函数(或您自行决定的任何其他非局部性)的实际示例,它们从类型推断中获得了一些好处?请不要发布愚蠢的例子,例如:
odd 0 = false
odd n = even(n-1)
even 0 = true
even n = odd(n-1)
我怀疑解析中会出现非愚蠢的实际示例。另外,您能否解释一下程序员可以从使用非本地类型推断中获得的好处?
更新:
我很欣赏任何本地类型推断不足和需要全面类型推断的例子。
您的 Haskell 或 OCaml 示例可能 90% 正确,因为您只有 90% 理解术语“非本地类型推断”。不过,您必须了解 Haskell(或 OCaml)类型推断。
您的示例可能使用 Scala 或 C# 编写。请指出,编译器确实有足够的信息来推断类型,但由于语言规范或 Scala 或 C# 中类型推断的仅限本地性质,无法推断类型。
// 再次,请随时纠正我的英语。
【问题讨论】:
-
我经常对 C# 中类型推断的 local-only 特性感到恼火。例如,如果我想将一个 LINQ 查询重构为一个函数,我经常不得不做一堆附带的编码(例如提出一个一次性的类型来表示查询投影)来实现这一点。跨度>
-
这似乎是一个奇怪的问题。正如 Daniel Pratt 所说,其好处与任何其他类型推理相同,并且只有 局部推理是一种虚假的限制,会妨碍重构。为什么你需要一个具体的例子来说明“为什么不削弱一个有用的功能”?
-
@user1123502:是的,一些语言特性使得完整的类型推断变得不可能,并且在这些特性的存在下削弱类型推断可能是明智的。这并不能解释为什么您希望有理由不对有用的功能进行人为限制。这就像在问“在函数名中允许字母 Q 真的有用吗?”。
-
此外,推理与注释的争论是无关紧要的。非本地类型推断不会禁止您使用注解,它只是让更多注解成为可选项。
-
首先,我认为您应该明确说明本地类型推断的含义,否则很难告诉您什么时候可以方便地拥有更多。
标签: haskell ocaml type-inference