函數返回的樹我有一個非二叉樹:與非二叉樹
data MultTree b = DataNode b | IndexNode Int Int [MultTree b] deriving (Show)
注意:DataNode's
像對待葉子和IndexNode's
狀分枝。
現在我儘量做到在IndexNode
較小Int
值設置爲子樹的DataNode
最小值和較大Int
值設置爲子樹的DataNode
最大的價值。
爲IndexNode's
不小Int
值設置爲子樹和更大的一個maxBound::Int
這是我的功能至今:
dataInterval:: (Ord a) => MultTree a -> MultTree a
dataInterval (DataNode x) = (DataNode x)
dataInterval(IndexNode x y [])
| x > y = (IndexNode (maxBound :: Int) (minBound :: Int) [])
| x < y = (IndexNode (minBound :: Int) (maxBound :: Int) [])
| x == y = (IndexNode x y [])
datenInterval (IndexNode x y subtrees)
| x > y = (IndexNode (maxValue subtrees) (minValue subtrees) (map (dataInterval subtrees)))
| x < y = (IndexNode (minValue subtrees) (maxValue subtrees) (map (dataInterval subtrees)))
| x == y = (IndexNode x y (map (dataInterval subtrees)))
必須調用函數dataInterval
遞歸。
現在我不知道該怎麼做,因爲dataInterval
預計一棵樹,但不知何故,我要打電話的完整列表。 dataInterval
不允許。
問題:我怎樣才能實現在使用列表中的子樹調用dataInterval
遞歸?那麼subtrees
列表中的每棵樹會被調用?
我想可能是這樣地圖的一些功能,但是返回子樹而不是列表。
此刻的錯誤信息看起來像這樣:
無法比擬預期型MultTree A2 與實際類型[MultTree A] *在datenIntervalle的第一個參數,即子樹 在地圖中,即(datenIntervalle子樹) 的第一個參數在IndexNode的第三個參數,即 (地圖(datenIntervalle子樹))
樣本樹&完整代碼:
t2 :: MultTree Int
t2 = IndexNode 3 42 [IndexNode 7 8 [DataNode 3, DataNode 5, DataNode 7, DataNode 9], DataNode 6, IndexNode 10 23 [DataNode 99, DataNode 78, DataNode 24]]
dataList:: MultTree a -> [a]
dataList(DataNode x) = [x]
dataList(IndexNode _ _ subtress) = concat' (map dataList subtress)
maxValue :: (Ord a) => MultTree a -> a
maxValue tree = maximum (dataList tree)
minValue :: (Ord a) => MultTree a -> a
minValue tree = minimum (dataList tree)
dataInterval:: (Ord a) => MultTree a -> MultTree a
dataInterval(DataNode x) = (DataNode x)
dataInterval(IndexNode x y [])
| x > y = (IndexNode (maxBound :: Int) (minBound :: Int) [])
| x < y = (IndexNode (minBound :: Int) (maxBound :: Int) [])
| x == y = (IndexNode x y [])
dataInterval(IndexNode x y subtrees)
| x > y = (IndexNode (maxValue subtrees) (minValue subtrees) (map (dataInterval subtrees)))
| x < y = (IndexNode (minValue subtrees) (maxValue subtrees) (map (dataInterval subtrees)))
| x == y = (IndexNode x y (map (dataInterval subtrees)))
你''dataIntervalsubtrees'和minValue''maxValue'沒有定義,據我所知? –
@WillemVanOnsem:對不起,我更新了我的問題。 – jublikon
如果您說:「現在我試圖在IndexNode中實現這一點,較小的Int值設置爲子樹的最小DataNode,較大的Int值設置爲子樹的最大DataNode。」是不是它需要的類型b是由於IndexNode Int Int的Int?此外,爲了澄清,DataNode始終是樹的葉子? –