我正在嘗試定義具有這些特征的資料結構:
- 這是一棵玫瑰樹
- 樹中的節點是可變排序的
- 節點型別之間的唯一區別是對它們可能采用的子節點數量的限制
- 完整的約束集是:無;僅一個; 僅兩個;最后一個; 至少兩個
- 我希望相關約束是可型別檢查和檢查的。(例如,在構建或編輯樹時,嘗試將第二個孩子添加到 IamJustOne :: OneOnly 是錯誤的)
我很難開始定義這種結構(尤其是第 3-5 點)。
- 網上有關于定義玫瑰樹所需步驟的資訊。
- Data.Tree.Rose 中有足夠的資訊來創建帶有變數節點的玫瑰樹。(盡管我仍然不清楚該模塊中 Knuth 樹和 Knuth 森林之間的區別。)
- 關于異構容器的研究水平論文遠高于我的理解水平
我最初的方法是嘗試創建 MyRose 的子型別(不作業的代碼):
data MyRose sub = MyRose {label :: String, subtype :: sub, children :: [MyRose sub]}
type AtLeastOne a = snoc a [a]
type AtLeastTwo a = snoc a ( snoc a [a] )
...
instance MyRose AtLeastOne where children = AtLeastOne MyRose -- instances to provide defaults
...
instance None STree where children = Nothing
我嘗試了各種使用資料、新型別、類、型別的方法,現在正在研究型別族和資料族。我的方法都沒有成效。
您能否建議定義此資料結構的指標。嬰兒的第一步將非常有用 - 很難低估我在這個主題上的知識水平。
uj5u.com熱心網友回復:
在你走瘋狂的高級路線之前,我建議確保簡單的路線還不夠好。簡單的路線如下所示:
data Tree = Node { label :: String, children :: Children }
data Children
= Zero
| One Tree
| Two Tree Tree
| Positive Tree [Tree]
| Many Tree Tree [Tree]
這是您的標準:
- 是玫瑰樹——呃,我猜?
- 樹中的節點是可變排序的——勾選,五個
Children建構式表示排序,每個Node建構式可能做出不同的選擇 - 排序之間的唯一區別是對他們可能帶走的孩子數量的限制——檢查
- 完整的約束集——檢查
- 相關約束是可型別檢查和檢查的——檢查,例如應用程式
One child1 child2不進行型別檢查
uj5u.com熱心網友回復:
即使您可以定義它,這種樹似乎也很難使用。樹的型別必須反映它的整個結構,并且客戶端必須隨身攜帶該型別,因為樹上的所有操作都需要知道該型別才能執行任何操作。他們不能只擁有一個Rose String或其他東西,他們需要知道確切的形狀。
讓我們想象一下你已經成功實作了你的目標。然后,您可能有一些示例樹t:
t :: OnlyTwo (AtLeastOne None)
表示具有 2 個節點的頂??層,每個節點至少有一個子節點,每個子節點都是空的。到底應該是什么型別的insert t "hello"?的deleteMin t?如果您洗掉單個節點,您無法真正知道樹的哪些級別可能需要折疊,或者如果您插入一個節點,您可能需要在哪里增加一個級別。
也許你有這些問題的答案,以及一些模糊的用例,這是最好的解決方案。但既然你要求寶寶的第一個解決方案:我想如果我是你,我會退后一步,問我為什么真的想要這個。您希望通過這種級別的型別詳細資訊實作什么目標?您希望客戶端代碼在使用或構建這樣的樹時看起來像什么?這些問題的答案將使問題變得更加清晰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/434053.html
