如何在OCaml中键入`let rec f g = g f`?

时间:2015-02-13 20:51:13

标签: ocaml typing

以下是翻译给我的内容:

# let rec f g = g f ;;
Error: This expression has type ('a -> 'b) -> 'c
       but an expression was expected of type 'a
       The type variable 'a occurs inside ('a -> 'b) -> 'c

如果我将-rectypes传递给解释器,它就可以了:

# let rec f g = g f ;;
val f : ('a -> 'b) -> 'b as 'a = <fun>

但是有没有办法在没有选择ocaml的情况下使其输入良好?

我不知道如何为代码添加注释,因为f的类型取决于g的类型,f本身取决于{{1}}的类型。

2 个答案:

答案 0 :(得分:1)

如果不使用-rectypes,就无法绕过这一点。

答案 1 :(得分:1)

按照目前的情况,你不能让它进行类型检查,原因已经被其他答案解释了。

然而,您可以通过使用多态变体包装函数参数来获得近似值:

# let rec f (`F g) = g (`F f);;
val f: [< `F of [> `F of 'a ] -> 'b ] -> 'b = <fun>

应用此函数的结果取决于其参数的行为:

# f (`F (fun _ -> 13));
-: int = 13
# f (`F f);; (* infinite recursion *)
^CInterrupted