簡體   English   中英

使用代數數據類型構建鏈

[英]construct a chain using algebraic data type

我正在嘗試學習使用代數數據類型,但我遇到了一些麻煩。

所以我想創建一個鏈條,它有金鏈、銀鏈或白金鏈。

目前我有以下數據類型:

data Link = G | S | P deriving (Eq, Show)
data Chain = Empty | Join Chain Link Chain

但現在我不確定如何構建鏈

我試圖構建一個按以下順序具有以下鏈接的鏈:Platinum, Gold, Gold

這就是我構建它的方式:

chain1 = (Join Empty G (Join Empty G (Join Empty P (Empty))))

但我不確定它是否正確。

提前致謝!

您的Chain類型允許任意樹結構(實際上,它與二叉樹的通用定義同構,

data Tree a = Empty | Node a    (Tree a) (Tree a)
data Chain' = Empty | Join Link Chain'    Chain'

相反,我會將鏈表示為使用兩個較小鏈的相鄰端隱式連接(為了簡單起見,不允許空鏈)。

data LinkType = G | S | P
data Chain =  Link LinkType | Join Chain Chain

-- two isomorphic representations of PGG: P(GG) and (PG)G
chain1a = Join (Link P) (Join (Link G) (Link G))
chain1b = Join (Join (Link P) (Link G)) (Link G)

如果您想加入具有給定鏈接的兩條鏈,請使用常規 function。

joinWith :: Link -> Chain -> Chain -> Chain
joinWith l c1 c2 = Join (Join c1 (Link l)) c2
-- or
-- joinWith l c1 c2 = Join c1 (Join c2 (Link l))

c1 = joinWith P (Link S) (Link G)  -- SPG

如果你想讓你的鏈元素指向彼此,你需要做一個像這樣的相互遞歸定義:

chain1 = Join Empty  G chain2
chain2 = Join chain1 G chain3
chain3 = Join chain2 P Empty

這種技術有時稱為“打結”,您可以在 .net 找到更多示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM