我对Haskell很陌生,因此对它不是很熟悉
以下方法用于测量MultTree
的大小。
MultTree
包括包含两个Int
的Index
节点,并且可以具有任意数量的子节点。然后还有包含一个Int
并且不能有子节点的Data
节点。因此,该方法应该确定的是,最长的"分支"有多长
到目前为止我的方法:
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]
作为一种类型代表">CCD_ 14类型值的列表;;但是作为模式;一个值的单例列表"——并且当该列表中存在不止一个值时,这种情况不被覆盖;非穷举模式";错误,即需要更多的模式来覆盖这些情况,但它们缺失了。
类似地,[Index c d [e]]
作为模式代表";MultTree a
类型的一个值的单例列表,其与模式Index c d [e]
匹配,其中c
和d
都是a
类型值,并且[e]
是由MultTree a
类型确定的类型的一值的单例名单,即MultTree a
:
data MultTree a = Index a a [MultTree a]
| ...