1

我正在尝试编写一个函数,给定两个表示图像的四叉树,将输出另一个布尔四叉树“掩码”,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)
4

2 回答 2

2

c2有 type a,但 mask 想要一个 type 的参数QT a。你应该@像下面一行那样使用一个模式:

m (Q a b c d) c2@(C _)   = Q (mask a c2) (mask b c2) (mask c c2) (mask d c2)

我认为上一行也有同样的问题。

于 2011-02-06T17:13:47.250 回答
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% 确定这是你想要做的,但我可能会也可能不会故意在这段代码中引入一些简单的错误,因为我不喜欢做作业)

编写好的代码更容易让它正确。如果不正确,则更容易找到错误。

很难帮你解决这个烂摊子。解决这种混乱的最简单方法是重写。那不是浪费吗?

在你去解决你的代码不起作用的小问题之前,请解决它是一团糟的大问题。我和其他人在维护不可维护的代码时遇到了很多痛苦,尝试编写好的代码。

于 2011-02-06T19:01:08.580 回答