我正在尝试编写一个函数,该函数将玫瑰树列表与其父节点是给定玫瑰树根节点的最高值相结合。例如;
RosesToRose [Rose 1 [Rose 1 [], Rose 2 []], Rose 3 [], Rose 4 [Rose 10 []]]
应该返回Rose 4 [Rose 1 [Rose 1 [], Rose 2 []], Rose 3 [], Rose 4 [Rose 10 []]]
我收到一个错误"函数 rosesToRose 中的非详尽模式",我不确定是什么原因造成的。尝试匹配空列表作为输入,但得到相同的错误。任何建议将不胜感激。
我的代码:
data Rose a = Rose a [Rose a]
deriving Show
rosesToRose:: (Ord a, Num a )=> [Rose a] -> Rose a
rosesToRose [(Rose node tree)] = Rose (maxRoseNode [(Rose node tree)]) [(Rose node tree)]
maxRoseNode:: (Ord a,Num a) =>[Rose a] -> a
maxRoseNode trs = case trs of
[] -> 0
(Rose node tree):xs -> maximum ([maxRoseNode xs] ++ [node])
您使用的模式将仅匹配仅包含一个元素的列表。确实是模式:
rosesToRose[(Rose node tree)]= …
将列表与一个Rose
对象匹配。但在示例数据中,您向它传递一个包含三个元素的列表。此外,如果您使用一个元素传递相同的列表,则maxRoseNode
没有多大意义。
你可以解决这个问题,只需将其与变量(例如rs
(匹配,然后构造一个Rose
,maxRoseNode rs
作为值,rs
作为子值:
rosesToRose :: (Ord a, Num a) => [Rose a] -> Rose a
rosesToRosers= Rose (maxRoseNoders)rs
您可以提高maxRoseNode
的可读性(和效率(,首先检查它是否为空列表,如果不是,则计算包装在Rose
s 中的项目的最大值:
maxRoseNode:: (Ord a, Num a) => [Rose a] -> a
maxRoseNode [] = 0
maxRoseNode xs = maximum (map((Rose x _) -> x)xs)
这里(Rose x _) -> x
是一个lambda 表达式,它将Rose x _
对象映射到x
。
例如:
Prelude> rosesToRose [Rose 1 [Rose 1 [], Rose 2 []], Rose 3 [], Rose 4 [Rose 10 []]]
Rose 4 [Rose 1 [Rose 1 [],Rose 2 []],Rose 3 [],Rose 4 [Rose 10 []]]