【发布时间】:2011-04-24 05:56:39
【问题描述】:
我一直在思考类型推断在以下 OCaml 程序中是如何工作的:
let rec f x = (g x) + 5
and g x = f (x + 5);;
当然,这个程序毫无用处(永远循环),但是类型呢? OCaml 说:
val f : int -> int = <fun>
val g : int -> int = <fun>
这正是我的直觉,但是类型推断算法是如何知道这一点的呢?
假设该算法首先考虑“f”:它可以得到的唯一约束是“g”的返回类型必须是“int”,因此它自己的返回类型也是“int”。但它不能通过“f”的定义来推断其参数的类型。
另一方面,如果它首先考虑“g”,它可以看到它自己的参数的类型必须是“int”。但是之前没有考虑过“f”,是无法知道“g”的返回类型也是“int”的。
它背后的魔力是什么?
【问题讨论】:
标签: recursion types ocaml type-inference