data (Eq a, Show a) => QT a = C a | Q (QT a) (QT a) (QT a) (QT a)
deriving (Eq, Show)
给定上述定义,请编写一个谓词来检查给定的图像(编码为四叉树)是否在垂直轴(水平对称)方面对称。尽可能使用匿名函数。
问题:如何为给定的四叉树实现水平对称性检查?
嗯,我想到了这样一种方法:当四叉树只是一个叶子时,在这种情况下,我们有水平对称性。基本情况是四叉树只有一个级别(四个叶子),对称性只是检查颜色 (c1 == c2 && c3 == c4) 的问题。
在任何其他情况下,我可以检查此条件是否递归满足:nw等于(fliphorizontal(ne)) && sw等于(fliphorizontal(se)),其中fliphorizontal水平翻转四叉树,并且equals检查两个四叉树是否相等。但是,如果可能的话,我想避免尽可能使用外部函数,只使用匿名函数。
ishsymmetric :: (Eq a, Show a) => QT a -> Bool
ishsymmetric (C _) = True
ishsymmetric (Q (C c1) (C c2) (C c3) (C c4)) = c1 == c2 && c3 == c4
ishsymmetric (Q nw ne sw se) =
编辑: fliph 示例:
fliph :: (Eq a, Show a) => QT a -> QT a
fliph (C a) = C a
fliph (Q nw ne sw se) = Q (fliph ne) (fliph nw) (fliph se) (fliph sw)
编辑: 最终一函数解决方案(使用广义折叠函数处理四叉树):
ishsymmetric :: (Eq a, Show a) => QT a -> Bool
ishsymmetric (C _) = True
ishsymmetric (Q a b c d) = and $ zipWith equals [a,c] [fliph b,fliph d]
where
fold f g (C c) = g c
fold f g (Q a b c d) = f (fold f g a) (fold f g b)
(fold f g c) (fold f g d)
fliph q = fold (\a b c d -> Q b a d c) (\c -> C c) q
equals (C c1) (C c2) = c1 == c2
equals (Q a b c d) (Q e f g h) = and $ zipWith equals [a,b,c,d] [e,f,g,h]
where
语法会适合您的需求 :-) http://freebsd.pastebin.com/QX1Bi0sj - YasirA