OCaml无限递归类型`type z = Z of z`的用途及构造方法咨询
OCaml 递归类型
type z = Z of z 说明 实例构造方法
OCaml 原生支持合法的递归值定义,只要递归表达式的最外层是代数类型构造子,就可以直接构造该类型的实例,不需要额外引入惰性求值标记:
(* 构造一个无限嵌套的 z 类型实例 *) let rec z_inst = Z z_inst
上面定义的z_inst是一个合法的z类型值,本质是无限嵌套的Z构造子,直接打印该值会触发无限输出。
实际用途
这类无数据载荷的递归类型,常见用途包括:
- 类型级标记(幻影类型参数):常配合GADT实现编译期的逻辑校验,比如作为类型级自然数的0标记,用来约束变长容器的长度、状态机的合法状态流转等。这种场景下不需要实际构造该类型的值,仅用类型本身做编译期的校验标识,天然和其他基础类型不兼容,可以避免非法的类型参数传入。
- Bottom类型实现:可以用来构造永远不会返回的函数,用来标记代码中不可能走到的分支,示例:
该函数的类型为let rec unreachable (Z x) = unreachable xz -> 'a,符合类型系统中底部类型的语义,可以在模式匹配的不可能分支中调用,避免编译器报未覆盖分支的警告。 - 纯函数式无限结构占位:可以用来构造不需要载荷的纯函数式循环数据结构,比如循环哨兵节点,不需要引入可变引用就能实现自引用的循环结构。
内容的提问来源于stack exchange,提问作者David 天宇 Wong
相关产品推荐
相关产品推荐

