0

私は次のコードを持っています:

F (S core ps) = FAll core [] ps
  where
    FAll core acc ((name, (pc : pcs)) : ps) 
       = case F' (pc : pcs) (readC pc core) core of
            Nothing -> 
                        if (length pcs) /= 0 then FAll core ((name, pcs) : acc) ps

                        else FAll core acc ps


            Just (core', [pc']) -> let
                                     pc'' = pc' `mod` coresize
                                     pcs' = pcs ++ [pc'']
                                   in  FAll core' ((name, pcs') : acc) ps
stepAll core acc [] = S core (reverse acc)

正常にコンパイルされますが、プログラムを実行すると、次のエラーが発生します。

Melon.hs:(172,10)-(182,74): ケースの非網羅的なパターン

ここで、行を示す番号は、「= case F' (pc : pcs) (readC pc core) コア」から「in FAll コア' ((name, pcs') : acc) ps」までの行です。

問題は (pc : pcs) のパターンを使い果たすことにあると思いますが、どうすれば解決できるのかわかりません。

どんな助けでも大歓迎です。

コードは次のように更新されました。

私は次のように書いた:

Just (core', (pc' : pcs')) -> let
                                  pc'' = pc' `mod` coresize
                                  pcs' = pcs' ++ [pc'']
                              in  stepAll core' ((name, pcs') : acc) ps
Just (core', []) -> stepAll core acc ps

しかし、プログラムは無限ループに陥ります:S

4

1 に答える 1

8

「非網羅的なパターン」とは、すべての可能な組み合わせをカバーしていない一連のパターン マッチがあることを意味します。コードには、次のようなケースがあります。

case {- stuff -} of
    Nothing ->               -- etc.
    Just (core', [pc']) ->   -- etc.

部分の両方のパターンを処理し、ペアには 1 つのパターンしかありませんが、単一要素のMaybeリストでのみ一致するため、またはのようなパターンの場合、これは失敗します。Just (core', [])Just (core', (pc' : pcs'))

一部のケースが発生しないことが予想される場合でも、通常は、考えられるすべてのケースを処理する (つまり、徹底的なパターン マッチを行う) のが最善です。ケースが不可能であると本当に確信している場合は、次のようなものを使用してerror "this will never happen because blah blah blah"ください。なぜそれが起こらないのか説明できない場合は、適切に処理することを検討する必要があります。:]

于 2011-12-09T21:05:05.313 に答える