gpt4 book ai didi

ocaml - 如何理解类型定义?

转载 作者:行者123 更新时间:2023-12-02 20:41:23 25 4
gpt4 key购买 nike

type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;;

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

Node中,Node是OCaml的内置类型吗? of 是什么意思?

谢谢。

最佳答案

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

因此Node (5, Empty, Node (6, Empty, Empty))int tree 类型的东西(类似于 Java 中的 Tree<Int>)。

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

type shape = Square of int | Rectangle of int * int

ShapeRectangle是我刚刚编写的标签(又是构造函数),它们允许我构造 shape 类型的值(在本例中,我选择让 Shape 仅采用一个参数,因为只需要长度来指定正方形,而 Rectangle 则需要长度和宽度)。没有任何东西具有 Shape 类型或Rectangle ,但事物的类型可以为 shape .

用英语阅读该行的一种方法是“我定义了一个名为 shape 的类型。shape 要么是单个整数的 Square,要么是两个整数的 Rectangle。”

现在也许出于某种原因我也想标记我的形状。

type 'label labelledshape = LabelledSquare of 'label * int | LabelledRectangle of 'label * int * int

报价'区分label不是类型(例如 int ),而是一个变量。这允许我写类似 LabelledSquare ("a label for a square", 5) 的内容其类型为 string labelledshape

请注意,虽然这允许多态性,但这些并不是 OCaml 中所谓的“多态变体”。我不会在这里讨论这一点,而是建议您查看 OCaml 文档或浏览 Stack Overflow 以获取更多详细信息。

关于ocaml - 如何理解类型定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46019759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com