ocaml - OCaml 中的循环类型定义

标签 ocaml

显然以下类型定义是循环:

type node = int * node;;
Error: The type abbreviation node is cyclic 

我的问题是为什么下面的一个不是循环

type tree = Node of int * tree;;

第二个定义也引用其自身。

最佳答案

一种看待它的方法是,node 是类型的缩写,而不是新类型本身。因此编译器(或任何感兴趣的人)必须查看内部以了解它的缩写。一旦你深入了解内部,你就会开始注意到一些难以分析的事情(例如,它是一种递归类型,因此可能需要许多展开)。

另一方面,tree 是一种新类型,其特征在于其构造函数。 (在本例中,只有一个构造函数 Node)。因此编译器(或其他相关方)根本不需要查看内部来确定类型是什么。一旦看到Node,类型就确定了。就算往里面看,也只需要往下看一层就可以了。这允许递归,而不会造成任何分析困难。

作为一个实际问题,第一类递归类型通常是无意的,并且它们会导致奇怪的类型。第二种类型实际上不可能被错误地创建,因为一路上都有小路标(构造函数);事实上,它们有点像类型系统的命脉。

关于ocaml - OCaml 中的循环类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22093873/

相关文章:

ocaml - 是否有其他方法可以解构 OCaml 中的选项类型?

module - ReasonML 循环依赖

functional-programming - 为什么在 OCaml 中使用模式匹配

unix - 使用 ocaml-cohttp Client.post 方法请求 HTTPS 服务器时如何调试 HANDSHAKE_FAILURE? (为什么我会收到这个错误?)

functional-programming - OCaml:提取元组的第n个元素?

random - 按长度过滤列表中的元素 - Ocaml

haskell - 如何从功能上计算未知大小列表的连续元素之间的差异?

concurrency - INRIA会向OCaml添加并发原语吗?

ocaml - 在 OCamlyacc 中使用外部类型声明

ocaml - 如何在 OCaml 中定义 "apply"