Node是什么?它是一个关键字吗?还是一种数据类型?我不知道它是如何工作的。
比如说,如果我定义了这个:
data Seq a = Empty | Node a (Seq a)
我是否在说有一个类型为Node的变量a,我是否在定义一个新类型,它确切是什么?
Node是什么?它是一个关键字吗?还是一种数据类型?我不知道它是如何工作的。
比如说,如果我定义了这个:
data Seq a = Empty | Node a (Seq a)
我是否在说有一个类型为Node的变量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)
Empty
和Node
是数据构造器[Haskell wiki]。每个类型为Seq a
的值都是一个Empty
或包含两个参数的Node
:第一个参数类型为a
,另一个是Seq a
值。Empty
、Node 1 Empty
、Node 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
的参数),可以在递归调用中使用。
一般来说,Node
是以大写字母开头的标识符,这意味着它是类型和数据构造函数的有效名称。
在此特定代码中,您将其定义为数据构造函数,它分别接受类型为 a
和 Seq a
的两个参数,并属于类型 Seq a
。
data Seq a = Empty | Node a (Seq a)
这是一个数据类型定义,其中Seq a
是类型,Empty
和Node a (Seq a)
是它的构造函数。
Node
是一个递归构造函数。它有一个值为a
类型的参数,在构造时接收。Node
的第二个参数是Seq a
类型的,这是Node
本身的类型,因此它成为一个递归数据结构。传递给Node
作为参数的Seq a
可以使用任何Seq
的构造函数来构造,包括Empty
和Node
。 Empty
关闭了递归数据结构,因为它不接收任何新的Seq a
类型的参数。
Node
是一个数据构造器。 - Willem Van OnsemGADTSyntax
语言标志:data Seq a where { Empty :: Seq a; Node :: a -> Seq a -> Seq a }
。虽然这种方式更冗长,但我觉得它更清晰地表明了语句定义了Seq
的数据构造函数Empty
和Node
,并明确显示了它们的类型签名。 - Jon Purdy