ocaml - 如何在 OCaml 中输入 `let rec f g = g f`?

标签 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的类型,而g的类型本身又取决于的类型f.

最佳答案

就目前情况而言,您无法对其进行类型检查,原因已由其他答案解释。

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

# 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

关于ocaml - 如何在 OCaml 中输入 `let rec f g = g f`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28508518/

相关文章:

javascript - 检测用户何时开始/停止在 jquery 中输入

python - 如何注释 Optional[int] 的包装器?难度 : when it's a parameter

reactjs - 输入 mapStateToProps React Redux

arrays - 如何打印数组数组?

C 到 OCaml - for 循环内的 If 条件 OCaml

ocaml - ocaml 中的 ('a * ' a) list 和 'a * ' a list 有什么区别?

python - 我应该到处注释类型吗?

python - Python 中基于类变量的类方法中的返回类型

ocaml - 在 OCaml 中将构造函数名称转换为字符串

regex - OCaml:如何测试我自己的正则表达式库