-1

我正在尝试编写一个函数,将玫瑰树列表与它们的父节点组合在一起,这些父节点是给定玫瑰树的根节点的最高值。例如;

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])
4

1 回答 1

1

您使用的模式只会匹配一个只有一个元素的列表。确实是这样的模式:

rosesToRose [(Rose node tree)] = …

将列表与一个 Rose对象匹配。但是在您的示例数据中,您向它传递了一个包含三个元素的列表。此外,maxRoseNode如果您通过一个元素传递相同的列表,则没有多大意义。

rs您可以通过将其与变量(例如)匹配来解决该问题,然后构造一个作为值和Rose作为子级的:maxRoseNode rsrs

rosesToRose :: (Ord a, Num a) => [Rose a] -> Rose a
rosesToRose rs = Rose (maxRoseNode rs) rs

maxRoseNode您可以通过首先检查它是否为空列表来提高 的可读性(和效率) ,如果不是,则计算包裹在Roses 中的项目的最大值:

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 []]]
于 2019-10-19T11:07:12.383 回答