haskell 中的节点是什么?
What is Node in haskell?
Node 到底是什么?是关键字吗?一种数据类型?我不知道它是如何工作的。
如果定义这个,例如
data Seq a = Empty | Node a (Seq a)
我是说有一个类型为Node的变量a,我是在定义一个新类型吗,它到底是什么?
一般来说,Node
是以大写字母开头的标识符,这意味着它是类型和数据构造函数的有效名称。
在此特定代码中,您将其定义为数据构造函数,该构造函数接受两个类型为 a
和 Seq 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
是类型,Empty
和 Node a (Seq a)
是其构造函数。
Node
是递归构造函数。它有一个 a
类型的值,它在构造时作为参数接收。 Node
的第二个参数是 Seq a
类型,也是 Node
本身的类型,因此它成为一个递归数据结构。作为参数传递给 Node
的 Seq a
可以使用任何 Seq
的构造函数构造,即 Empty
和 Node
。 Empty
关闭递归数据结构,因为它本身不接收任何 Seq a
.
类型的新参数
在这种情况下,Empty
和 Node
是 data constructors [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
,它将 return 为零。对于 Node
,变量 xs
指的是值的第二个参数(因此也是类型 Seq a
),然后可以在递归调用中使用。
Node 到底是什么?是关键字吗?一种数据类型?我不知道它是如何工作的。
如果定义这个,例如
data Seq a = Empty | Node a (Seq a)
我是说有一个类型为Node的变量a,我是在定义一个新类型吗,它到底是什么?
一般来说,Node
是以大写字母开头的标识符,这意味着它是类型和数据构造函数的有效名称。
在此特定代码中,您将其定义为数据构造函数,该构造函数接受两个类型为 a
和 Seq 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
是类型,Empty
和 Node a (Seq a)
是其构造函数。
Node
是递归构造函数。它有一个 a
类型的值,它在构造时作为参数接收。 Node
的第二个参数是 Seq a
类型,也是 Node
本身的类型,因此它成为一个递归数据结构。作为参数传递给 Node
的 Seq a
可以使用任何 Seq
的构造函数构造,即 Empty
和 Node
。 Empty
关闭递归数据结构,因为它本身不接收任何 Seq a
.
在这种情况下,Empty
和 Node
是 data constructors [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
,它将 return 为零。对于 Node
,变量 xs
指的是值的第二个参数(因此也是类型 Seq a
),然后可以在递归调用中使用。