節點究竟是什么?是關鍵字嗎?資料型別?我無法弄清楚它是如何作業的。
如果定義這個,例如
data Seq a = Empty | Node a (Seq a)
我是說有一個 Node 型別的變數 a,我是在定義一個新型別,它到底是什么?
uj5u.com熱心網友回復:
通常,Node是以大寫字母開頭的識別符號,這意味著它是型別和資料建構式的有效名稱。
在這個特定的代碼,你將它定義為一個資料建構式的型別的兩個引數a,并Seq a分別屬于型別Seq a。
uj5u.com熱心網友回復:
正如評論所述,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)
uj5u.com熱心網友回復:
在這種情況下,Empty和Node是資料建構式[Haskell wiki]。每個帶有 type 的Seq a值要么是 an Empty,要么是Node包裝了兩個引數的 a :第一個是 type a,另一個是Seq a值。
因此,在這種情況下,可以構造任意大小的值,例如Empty, Node 1 Empty,Node 1 (Node 4 Empty)等。因此,您的定義看起來像一個 list 的定義[],它在 Haskell 中實作為一個鏈表。
您可以將資料建構式用作函式,它們為引數取引數,因此Node可以用作函式Node :: a -> Seq a -> Seq a。
資料建構式也用于模式匹配。例如,您可以實作一個功能:
seqSize :: Seq a -> Int
seqSize Empty = 0
seqSize (Node _ xs) = 1 seqSize xs
因此,它將在此處進行模式匹配,如果值為 an Empty,它將回傳零。對于 aNode變數xs是指值的第二個引數(也是 type Seq a),然后可以在遞回呼叫中使用它。
uj5u.com熱心網友回復:
data Seq a = Empty | Node a (Seq a)
是資料型別定義,其中Seq a是型別,Empty和Node a (Seq a)是其建構式。
Node是一個遞回建構式。它有一個 type 值a,它在構造時作為引數接收。to的第二個引數Node的型別Seq a是Node它自己的型別,因此它成為一個遞回的資料結構。Seq a作為引數傳遞給 的Node可以用任何Seqs 建構式構造,即Empty和Node。Empty關閉遞回資料結構,因為它不接收任何型別的新引數Seq a。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/370604.html
下一篇:帶正數的減法
