haskell 中的节点是什么?

What is Node in haskell?

Node 到底是什么?是关键字吗?一种数据类型?我不知道它是如何工作的。

如果定义这个,例如

data Seq a = Empty | Node a (Seq a)

我是说有一个类型为Node的变量a,我是在定义一个新类型吗,它到底是什么?

一般来说,Node是以大写字母开头的标识符,这意味着它是类型和数据构造函数的有效名称。

在此特定代码中,您将其定义为数据构造函数,该构造函数接受两个类型为 aSeq a 的参数,并且属于类型 Seq a.

如评论所述,Node 是数据构造函数。这意味着它是构造 Seq a 类型值的一种可能方式(其中 a 代表另一种类型)。

这个特定的数据结构表示一个序列,可以使用 Empty 数据构造函数或 Node 数据构造函数来构造。

例如:

empty :: Seq a
empty = Empty

seqOf1Int :: Seq Int
seqOf1Int = Node 5 Empty

seqOf2Strings :: Seq String
seqOf2Strings = Node "hello" (Node "world" Empty)
data Seq a = Empty | Node a (Seq a)

是数据类型定义,其中 Seq a 是类型,EmptyNode a (Seq a) 是其构造函数。

Node 是递归构造函数。它有一个 a 类型的值,它在构造时作为参数接收。 Node 的第二个参数是 Seq a 类型,也是 Node 本身的类型,因此它成为一个递归数据结构。作为参数传递给 NodeSeq a 可以使用任何 Seq 的构造函数构造,即 EmptyNodeEmpty 关闭递归数据结构,因为它本身不接收任何 Seq a.

类型的新参数

在这种情况下,EmptyNodedata constructors [Haskell wiki]。每个 Seq a 类型的值要么是 Empty,要么是包含两个参数的 Node:第一个是 a 类型,另一个是 Seq a ]值。

因此在这种情况下可以构造任意大小的值,例如 EmptyNode 1 EmptyNode 1 (Node 4 Empty) 等。因此您的定义看起来像列表的定义 [],在Haskell.

中实现为链表

您可以将数据构造函数用作函数,它们为参数获取参数,因此 Node 可以用作函数 Node :: a -> Seq a -> Seq a

数据构造函数也用于模式匹配。例如你可以实现一个函数:

seqSize :: Seq a -> Int
seqSize <strong>Empty</strong> = 0
seqSize <strong>(Node _ xs)</strong> = 1 + seqSize xs

这里它将因此进行模式匹配,如果值为 Empty,它将 return 为零。对于 Node,变量 xs 指的是值的第二个参数(因此也是类型 Seq a),然后可以在递归调用中使用。