如何在 OCaml 中输入 `let rec f g = g f`?
How to type `let rec f g = g f` in OCaml?
这是口译员给我的:
# 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
的类型,而g
的类型本身取决于f
的类型。
不使用 -rectypes
就无法避免这种情况。
按照目前的情况,你不能让它进行类型检查,其他答案已经解释了原因。
然而,您可以通过用多态变体包装函数参数来获得近似值:
# 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
这是口译员给我的:
# 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
的类型,而g
的类型本身取决于f
的类型。
不使用 -rectypes
就无法避免这种情况。
按照目前的情况,你不能让它进行类型检查,其他答案已经解释了原因。
然而,您可以通过用多态变体包装函数参数来获得近似值:
# 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