如何在 Haskell 中测量 MultTree 的大小?

问题描述

我对 Haskell 很陌生,因此对它不是很熟悉。

下面的方法是测量一个MultTree的大小。

MultTree 包含 Index 节点,其中包含两个 Int 并且可以有任意数量的子节点。然后还有 Data 节点包含一个 Int 并且不能有子节点。那么该方法应该确定的是,最长的“分支”有多长。

到目前为止我的方法

data MultTree a = Index a a [MultTree a] | Data a deriving Show

size :: MultTree a -> Int
size (Index a b []) = 1
size (Index a b [Index c d [e]]) = size (Index c d [e]) + 1

它确实可以编译,但是在尝试使用它时,我得到 "non-exhaustive patterns in function size"。即使我不会收到那个错误,我也知道它不会像我希望的那样工作。

但不知何故,我无法想出解决问题的办法。

我将不胜感激。

提前致谢!

解决方法

你写道:

“那么该方法应该确定的是,最长的'分支'有多长。”

它不是“大小”,它通常被称为“深度”:

depth :: MultTree a -> Int

那我们有什么? a 是值,存在于 Index 分支节点或 Data 叶节点中:

data MultTree a = Index a a [MultTree a] 
                | Data a 
                deriving Show

depth (Data a)          = 0   -- or 1,whatever you prefer
depth (Index _ _ trees) = 

好吧,我们对值本身没有用,至于树,如果我们能找到每个树的深度,我们就可以找到最大值,用

    let max_depth = maximum [ find_depth t | t <- trees ]
    in
        max_depth + 1

现在开始编写 find_depth 函数。它所需的类型(由我们如何使用它决定)是 find_depth :: MultTree a -> Int。嗯,

(其余部分有意留空)




哦,错误的原因是,[e] as a type 代表“e 类型值的列表” ;但是作为一种模式,它代表“一个值的单例列表”——当列表中有多个值时,这种情况不包括在内,因此,“非穷举模式”错误,即需要更多模式来涵盖这些情况,但它们缺失了。

同样,[Index c d [e]] 作为模式代表“一个的单例列表,类型为MultTree a,匹配模式{ {1}} 其中 Index c d [e]c 都是 d 类型的值,a 是由 {{ 1}} 类型——即,再次,[e]

MultTree a