1

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

下面的方法是测量a的大小MultTree

AMultTree包括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". 即使我不会得到那个错误,我也知道它不会按照我想要的方式工作。

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

我将不胜感激各种帮助。

已经提前谢谢你了!

4

1 回答 1

3

你写:

“所以方法应该确定的是,最长的‘分支’有多长。”

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

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] 因为类型代表“ -type值列表”;e作为一种模式,它代表“一个值的单例列表” - 当该列表中有多个值时,这种情况不包括在内,因此“非详尽模式”错误,即需要更多的模式来涵盖这些情况,但它们缺失了。

类似地,[Index c d [e]] 作为一个模式代表“一个类型的一个MultTree a的单例列表,它匹配Index c d [e]其中cd都是a-type 值的模式,并且[e]是由类型确定的类型的一个值的单例列表MultTree a- 即,再次,MultTree a

data MultTree a = Index a a [MultTree a] 
                | ...
于 2021-01-23T12:49:43.200 回答