函数中的非穷举模式.创造玫瑰树哈斯克尔



我正在尝试编写一个函数,该函数将玫瑰树列表与其父节点是给定玫瑰树根节点的最高值相结合。例如;

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(匹配,然后构造一个RosemaxRoseNode rs作为值,rs作为子值:

rosesToRose :: (Ord a, Num a) => [Rose a] -> Rose a
rosesToRosers= Rose (maxRoseNoders)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 []]]

相关内容

  • 没有找到相关文章

最新更新