函数返回的树我有一个非二叉树:与非二叉树
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始终是树的叶子? –