想象一下四叉树定义如下:
data (Eq a, Show a) => QT a = C a | Q (QT a) (QT a) (QT a) (QT a)
deriving (Eq, Show)
bad1 = Q u u u u where u = C 255
bad2 = Q (C 0) (C 255) (Q u u u u) (C 64) where u = C 255
构造函数允许您创建格式不正确的四叉树。 bad1
应该只是C 255而且bad2
也是无效的,因为它的右下四叉树(出于同样的原因,它应该是Q (C 0) (C 255) (C 244) (C 64)
。
到目前为止一切顺利。检查其良好的形式只是递归地检查其内部四叉树的问题。 基本情况是指所有内部四叉树都是 leafs ,因此所有颜色都不应该等于。
wellformed :: (Eq a, Show a) => QT a -> Bool
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4]
wellformed (Q (C c1) (C c2) se (C c4)) = valid se
-- continue defining patters to match e.g Q C C C, C Q Q C, and so on...
问题:我可以避免为所有可能的叶子和四叉树组合键入所有匹配项吗?
如果我的问题很奇怪,请耐心等待,但这是我的第二天 - Haskell无缝学习!
答案 0 :(得分:4)
...没关系
wellformed :: (Eq a, Show a) => QT a -> Bool
wellformed (C _) = True
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4]
wellformed (Q nw ne se sw) = wellformed nw && wellformed ne
&& wellformed se && wellformed sw
编辑:甚至更好:
wellformed :: (Eq a, Show a) => QT a -> Bool
wellformed (C _) = True
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4]
wellformed (Q nw ne se sw) = all wellformed [nw, ne, se, sw]
编辑:请注意绑定错误,应该是:NW NE SW SE !!!