问题描述
我对 Haskell 很陌生,因此对它不是很熟悉。
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