[英]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.