我有以下代码:
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
中的非穷举模式其中表示行数的数字是从"= case F' (pc: pcs) (readC pc core) core of"到"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
"非详尽模式"意味着您有一组模式匹配,但不包括所有可能的组合。在您的代码中,有如下情况:
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"
这样的东西。如果你不能解释为什么它永远不会发生,那么你应该考虑妥善处理它。:]