Haskell 中的 Node 是什么?

Kev*_* M. 6 haskell nodes data-structures

节点到底是什么?它是一个关键字吗?数据类型?我不明白它是如何工作的。

如果定义这个,例如

data Seq a = Empty | Node a (Seq a)
Run Code Online (Sandbox Code Playgroud)

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

sam*_*dy1 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)
Run Code Online (Sandbox Code Playgroud)


Wil*_*sem 5

在这种情况下,EmptyNode数据构造函数[Haskell wiki]。每个类型的值Seq a要么是Empty, 要么Node是包装两个参数的 a :第一个参数是 type a,另一个是Seq a值。

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

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

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

seqSize :: Seq a -> Int
seqSize Empty = 0
seqSize (Node _ xs) = 1 + seqSize xs
Run Code Online (Sandbox Code Playgroud)

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