Kev*_* M. 6 haskell nodes data-structures
节点到底是什么?它是一个关键字吗?数据类型?我不明白它是如何工作的。
如果定义这个,例如
data Seq a = Empty | Node a (Seq a)
Run Code Online (Sandbox Code Playgroud)
我是说有一个类型为 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)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Empty
和Node
是数据构造函数[Haskell wiki]。每个类型的值Seq a
要么是Empty
, 要么Node
是包装两个参数的 a :第一个参数是 type a
,另一个是Seq a
值。
因此,在这种情况下,可以构造任意大小的值,例如、Empty
、等。因此,您的定义看起来像 list 的定义,它在 Haskell 中实现为链表。Node 1 Empty
Node 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
),然后可以在递归调用中使用。
归档时间: |
|
查看次数: |
1436 次 |
最近记录: |