Ocaml 如何理解类型定义?

Ocaml 如何理解类型定义?,ocaml,Ocaml,键入'a tree=Empty |'a*'a tree*'a tree;的节点 它是一个类型定义,其中a是一个类型参数,tree是类型名吗 在的节点中,节点是OCaml的内置类型吗?这是什么意思 谢谢。是“a是一个类型参数,tree是一个类型名,这些在OCaml中通常称为变体。这与大多数其他语言的顺序相反。Node是OCaml中名为tag的构造函数,of只是OCaml中用于指定构造函数参数类型的关键字。Node不是OCaml的内置类型,它甚至不是一个类型,而是,正如我所说的,一个构造函数 因此,

键入'a tree=Empty |'a*'a tree*'a tree;的节点

它是一个类型定义,其中a是一个类型参数,tree是类型名吗

在的节点中,节点是OCaml的内置类型吗?这是什么意思

谢谢。

是“a是一个类型参数,tree是一个类型名,这些在OCaml中通常称为变体。这与大多数其他语言的顺序相反。Node是OCaml中名为tag的构造函数,of只是OCaml中用于指定构造函数参数类型的关键字。Node不是OCaml的内置类型,它甚至不是一个类型,而是,正如我所说的,一个构造函数

因此,节点5,Empty,节点6,Empty,Empty是int-tree类型的东西,类似于Java中的tree

如果从一个更简单的变体开始,它可能更有意义

type shape = Square of int | Rectangle of int * int
Shape和Rectangle是我刚刚编写的构造函数,允许我构造Shape类型的值。在本例中,我选择让Shape只接受一个参数,因为指定正方形只需要长度,而矩形需要长度和宽度。没有任何东西有形状或矩形的类型,但事物可以有形状的类型

用英语读这句话的一种方法是我定义了一种叫做shape的类型。形状可以是单个整数的正方形,也可以是两个整数的矩形

现在也许出于某种原因,我也想给我的形状贴上标签

type 'label labelledshape = LabelledSquare of 'label * int | LabelledRectangle of 'label * int * int
引号“区分了标签不是int之类的类型,而是一个变量。这允许我写一些类似于LabelledSquare的东西,一个正方形的标签,5是字符串labelledshape类型

请注意,尽管这允许多态性,但这些并不是OCaml中所称的多态性变体。我在这里不讨论这一点,而是建议您查看OCaml文档或浏览堆栈溢出以了解更多详细信息。

Yes“a是一个类型参数,tree是一个类型名称这些在OCaml中通常称为变体。这与大多数其他语言的顺序相反。Node是OCaml中名为tag的构造函数,of只是OCaml中用于指定构造函数参数类型的关键字。Node不是OCaml的内置类型,它甚至不是一个类型,而是,正如我所说的,一个构造函数

因此,节点5,Empty,节点6,Empty,Empty是int-tree类型的东西,类似于Java中的tree

如果从一个更简单的变体开始,它可能更有意义

type shape = Square of int | Rectangle of int * int
Shape和Rectangle是我刚刚编写的构造函数,允许我构造Shape类型的值。在本例中,我选择让Shape只接受一个参数,因为指定正方形只需要长度,而矩形需要长度和宽度。没有任何东西有形状或矩形的类型,但事物可以有形状的类型

用英语读这句话的一种方法是我定义了一种叫做shape的类型。形状可以是单个整数的正方形,也可以是两个整数的矩形

现在也许出于某种原因,我也想给我的形状贴上标签

type 'label labelledshape = LabelledSquare of 'label * int | LabelledRectangle of 'label * int * int
引号“区分了标签不是int之类的类型,而是一个变量。这允许我写一些类似于LabelledSquare的东西,一个正方形的标签,5是字符串labelledshape类型


请注意,尽管这允许多态性,但这些并不是OCaml中所称的多态性变体。我在这里不讨论这个问题,而是建议您查看OCaml文档或浏览Stack Overflow以了解更多关于这个问题的详细信息。

根据该类型定义:

type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;;
以下是OCaml编译器基于它大致了解的事实:

树是一元类型构造函数。这意味着对于任何类型的t,t-tree也是一种类型,例如:int-tree。 Empty是“树”的0元构造函数。这意味着对于任何t,Empty都有类型t tree。 节点是一个三元构造函数。这里这意味着如果a有类型t,b有类型t树,c有类型t树,那么节点a,b,chas-typet树:这就是samet` 只有这两种方法才能获得t tree类型的值。这意味着您可以使用模式匹配。。。带|空->…|节点a、b、c->。。。。
根据该类型定义:

type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;;
以下是OCaml编译器基于它大致了解的事实:

树是一元类型构造函数。这意味着对于任何类型的t,t-tree也是一种类型,例如:int-tree。 Empty是“树”的0元构造函数。这意味着对于任何t,Empty都有类型t tree。 节点是一个三元构造函数。这里这意味着如果a有类型t,b有类型t树,c有类型t树,那么节点a,b,chas-typet树:这就是samet` 只有这两种方法才能获得t tree类型的值。这意味着您可以使用模式匹配。。。带|空->…|节点a、b、c->。。。。
谢谢节点是类型构造函数,即构造类型的构造函数吗?需要定义节点吗?@Tim是的,它是一个类型构造函数,因此不是
需要定义实现为什么不需要定义节点?如果未定义节点,“树是未定义的类型吗?”则定义树。让我重新表述一下我所说的没有定义任何实现的意思。在许多受ML启发的语言中,可以说是凭空生成类型的值。例如,您可能需要一个变体类型color=Red | Green | Blue红色到底是什么?它的实现定义在哪里?我会回答你,你定义了一个新的原语,红色,它不是由其他任何东西组成的,是颜色类型。这相当于试图回答类似整数5的问题。对于Node来说,类似的思想是,它需要参数。这与C++、java等语言不同,在这里很少定义一个新的原始值,而是构造其他类型的复合类。也就是说,你可以用枚举来模仿这一点,但人们通常对这一点有不同的直觉。节点是类型构造函数,即构造类型的构造函数吗?需要定义节点吗?@Tim是的,它是一个类型构造函数,因此不需要定义实现为什么不需要定义节点?如果未定义节点,“树是未定义的类型吗?”则定义树。让我重新表述一下我所说的没有定义任何实现的意思。在许多受ML启发的语言中,可以说是凭空生成类型的值。例如,您可能需要一个变体类型color=Red | Green | Blue红色到底是什么?它的实现定义在哪里?我会回答你,你定义了一个新的原语,红色,它不是由其他任何东西组成的,是颜色类型。这相当于试图回答类似整数5的问题。对于Node来说,类似的思想是,它需要参数。这与C++、java等语言不同,在这里很少定义一个新的原始值,而是构造其他类型的复合类。尽管如此,您可以通过枚举来模拟这一点,但人们通常会对其附加不同的直觉