我如何理解 OCaml 用户定义的类型?
How can I understand OCaml user defined type?
(* Data type definitions *)
type t =
| True
| False
| If of t * t * t
| Zero
| Succ of t
| Pred of t
| IsZero of t
在If of t * t * t
中,为什么要用'*'连接,怎么理解?
您的 t
类型的 If
构造函数采用三个参数。例如,在 Java 中,我们会把它写成像这样的构造函数
If(T a, T b, T c) { ... }
现在,我们可以将接受三个参数的函数从概念上看成接受包含三个事物的元组的函数。元组是一种数学对象,它代表了拥有固定大小的有序集合的“最一般方式”。因此,三个整数的元组是在单个数据结构中具有三个整数的“最一般方式”(对于“最”、“一般”和“方式”的某些定义)。
现在,类别理论家将这种“最一般方式”的事物称为乘积,就像我们说 3 和 5 的乘积是 15 一样。您可以继续阅读为什么我们称它为乘积以及哪些好的属性如果你愿意,它在维基百科上有,但基本思想是:元组满足乘法的许多“常见”数学属性,如交换性、结合性和加法的分配性。因此,为了符合这个数学约定,OCaml 使用 *
(我们用来乘以数字的相同符号)来指示类型的“乘积”。因此,
t * t * t
是三个 t
值的集合,按顺序打包到一个元组中。在 Haskell 中,我们可以简单地写成 (T, T, T)
。如果你熟悉 Typescript,我们会把它写成 [T, T, T]
(Typescript 中的元组只是我们碰巧提前知道元素的长度和类型的列表)。 Java 并没有与此等效的概念。
(* Data type definitions *)
type t =
| True
| False
| If of t * t * t
| Zero
| Succ of t
| Pred of t
| IsZero of t
在If of t * t * t
中,为什么要用'*'连接,怎么理解?
您的 t
类型的 If
构造函数采用三个参数。例如,在 Java 中,我们会把它写成像这样的构造函数
If(T a, T b, T c) { ... }
现在,我们可以将接受三个参数的函数从概念上看成接受包含三个事物的元组的函数。元组是一种数学对象,它代表了拥有固定大小的有序集合的“最一般方式”。因此,三个整数的元组是在单个数据结构中具有三个整数的“最一般方式”(对于“最”、“一般”和“方式”的某些定义)。
现在,类别理论家将这种“最一般方式”的事物称为乘积,就像我们说 3 和 5 的乘积是 15 一样。您可以继续阅读为什么我们称它为乘积以及哪些好的属性如果你愿意,它在维基百科上有,但基本思想是:元组满足乘法的许多“常见”数学属性,如交换性、结合性和加法的分配性。因此,为了符合这个数学约定,OCaml 使用 *
(我们用来乘以数字的相同符号)来指示类型的“乘积”。因此,
t * t * t
是三个 t
值的集合,按顺序打包到一个元组中。在 Haskell 中,我们可以简单地写成 (T, T, T)
。如果你熟悉 Typescript,我们会把它写成 [T, T, T]
(Typescript 中的元组只是我们碰巧提前知道元素的长度和类型的列表)。 Java 并没有与此等效的概念。