1

True画像を表す2つの四分木が与えられた場合、両方の四分木が同じ色で対応する位置にある場合はピクセルの値を使用して、別のブール四分木「マスク」を出力する関数を作成しようとしてい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タイプaはですが、マスクはタイプの引数を必要とします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 に答える