什么是 Haskell 中的 Node?

6

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

比如说,如果我定义了这个:

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

我是否在说有一个类型为Node的变量a,我是否在定义一个新类型,它确切是什么?


5
Node是一个数据构造器 - Willem Van Onsem
另一种编写方式是使用GADTSyntax语言标志:data Seq a where { Empty :: Seq a; Node :: a -> Seq a -> Seq a }。虽然这种方式更冗长,但我觉得它更清晰地表明了语句定义Seq的数据构造函数EmptyNode,并明确显示了它们的类型签名。 - Jon Purdy
4个回答

6

正如评论所述,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)

5
在这种情况下,EmptyNode数据构造器[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,则返回零。对于一个 Node,变量 xs 指的是值的第二个参数(也是类型为 Seq a 的参数),可以在递归调用中使用。


4

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

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


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

这是一个数据类型定义,其中Seq a是类型,EmptyNode a (Seq a)是它的构造函数。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接