如何推断出这个函数的类型?

时间:2013-07-03 10:16:59

标签: recursion functional-programming ocaml type-inference

我正在摸索着想出这个功能的签名

let make_rec f_norec =
  let rec f x = f_norec f x in
  f

应该是

val make_rec : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>

注意有一个奇怪的递归定义。当然,我在那里缺少一些知识。谁能告诉我如何计算函数的类型(如类型推理系统那样)?

非常感谢。

1 个答案:

答案 0 :(得分:6)

从内部开始,向外工作:

  1. 让我们调用x a
  2. 的类型
  3. 然后f的类型为a -> bb的结果类型为f
  4. f_norec需要fx,且必须返回与f相同的类型,因此(a->b) -> a -> b
  5. make_rec获取f_norec,并返回f。因此((a->b)->a->b) -> (a->b)。出于语法原因,可以省略最后一对括号。