Haskell - Неисчерпывающие паттерны в случае - PullRequest
0 голосов
/ 10 декабря 2011

У меня есть следующий код:

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)" to the "in FAll core '((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

1 Ответ

8 голосов
/ 10 декабря 2011

«Неисчерпывающие шаблоны» означает, что у вас есть набор совпадений шаблонов, которые не охватывают все возможные комбинации. В вашем коде есть следующие случаи:

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

Вы обрабатываете оба шаблона для части Maybe, и у пары есть только один шаблон, но вы подходите только для одноэлементного списка , поэтому это не удастся для шаблонов, которые выглядят как Just (core', []) или Just (core', (pc' : pcs')).

Обычно лучше всего обрабатывать все возможные случаи (т. Е. Иметь исчерпывающие совпадения с образцами), даже если вы ожидаете, что некоторые случаи никогда не произойдут. Если вы действительно уверены, что дело невозможно, используйте что-то вроде error "this will never happen because blah blah blah". Если вы не можете объяснить, почему это никогда не произойдет, тогда вам следует рассмотреть правильное обращение с ним. :]

...