我正在尝试编写一个函数,给定两个代表图像的四叉树,将输出另一个布尔四叉树“掩码”,如果两个四叉树的颜色与相应位置具有相同的颜色,则值为True
,并且否则False
。
我收到了这个错误:
Occurs check: cannot construct the infinite type: a = QT a
Expected type: QT (QT a)
Inferred type: QT a
In the second argument of `mask', namely `c2'
In the first argument of `Q', namely `(mask a c2)'
并不明白为什么。功能是:
data (Eq a, Show a) => QT a = C a | Q (QT a) (QT a) (QT a) (QT a)
deriving (Eq, Show)
mask :: (Eq a, Show a) => QT a -> QT a -> QT Bool
mask q1 q2 = m q1 q2
where
m (C c1) (C c2) = C (c1 == c2)
m (Q (C a) (C b) (C c) (C d)) (Q (C e) (C f) (C g) (C h))
| and $ zipWith (==) [a, b, c, d] [e, f, g, h] = C True
| otherwise = Q (mask a e) (mask b f) (mask c g) (mask d f)
m (Q a b c d) (C c2) = Q (mask a c2) (mask b c2) (mask c c2) (mask d c2)
m c@(C _) q@(Q _ _ _ _) = mask q c
m (Q a b c d) (Q e f g h) = Q (mask a e) (mask b f) (mask c g) (mask d h)
答案 0 :(得分:2)
c2
的类型为a
,但mask需要类型为QT a
的参数。您应该使用@
模式,就像在其下面的行上一样:
m (Q a b c d) c2@(C _) = Q (mask a c2) (mask b c2) (mask c c2) (mask d c2)
我认为上一行也存在同样的问题。
答案 1 :(得分:1)
你没有问过这个,但是......这一行:
m (Q (C a) (C b) (C c) (C d)) (Q (C e) (C f) (C g) (C h))
只是......
很多年前,我和一位朋友学会了在BASIC编程。他创造了一个非常酷的太空飞船游戏。我告诉他,他应该增加更多的太空飞船,那会更酷。他说这很辛苦。结果他不知道阵列,并且在屏幕上的8艘船中都有代码重复。
请制作更干净的代码,如下所示:
data SplitTree a = Leaf a | SplitNode [SplitTree a]
deriving (Eq, Show)
mask :: Eq a => SplitTree a -> SplitTree a -> SplitTree Bool
mask (Leaf x) (Leaf y) = Leaf (x == y)
mask (SplitNode xs) (SplitNode ys)
| and $ zipWith (==) xs ys = Leaf False
| otherwise = SplitNode $ zipWith mask xs xs
(我不是100%确定这是你想要做的,但我可能会或者可能没有故意在这段代码中引入一些简单的错误,因为我不喜欢做作业)
编写好的代码可以更容易地使其正确。如果它不正确,则更容易找到错误。
很难帮助你解决这个烂摊子。修复这种混乱的最简单方法是重写。这不是浪费吗?
在你解决你的代码不能正常工作的小问题之前,请解决一个混乱的大问题。我和其他人在维护不可维护的代码方面遭受了很多苦难,请尝试制作好的代码。