我正在尝试通过TriTree搜索。
我为我的树设置了这个类型这是我对node2的搜索函数:
data TriTree a
= Empty
| NodeOne a (TriTree a) (TriTree a) (TriTree a)
| NodeTwo a a (TriTree a) (TriTree a) (TriTree a)
deriving (Show)
search :: Ord a => a -> TriTree a -> Bool
search _ Empty = False
search x (NodeOne v a b c) = x == v || x `search` a || x `search` b || x `search` c
search x (NodeTwo u v a b c) = x == u || x == v || x `search` a || x `search` b || x `search` c
search x _ = undefined
其他人也有同样的问题;我们给出了类型,但需要实现搜索。我为NodeTwo实现的搜索函数是否有效?如果在一个调用中不处理NodeOne和node2,它甚至是模式匹配吗?
当您编写search x _ = undefined
时,您已经匹配了所有可能的情况,所以这是不必要的。你的编译器会警告你这个模式是多余的。
否则,这似乎工作得很好。在我看来,您使用模式匹配处理使用Empty
,NodeOne
或NodeTwo
构建的TriTree
值的方法是正确的。
这三个子句确实属于同一个函数定义,因此它们在一个调用中处理所有三种可能的情况。当重写为等价的case ... of ...
表达式时,这一点会更清晰。