イメージを表現する2つのクオッドツリーが与えられた場合、両方のクオッドツリーが同じ色で対応する位置にある場合は、値が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 [email protected](C _) [email protected](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)
これを "統一"しようとすると、コンパイラは型 "a"は "QT a"と等しくなければならないと推測します。これはQT(QT(QT ....))) QTラッパーの無限チェーンこれがこのエラーの意味です。 –