详尽的情况下,我有一个case
表达了比较多的模式:与一元后卫
case x of
... -> ...
... -> ...
... -> ...
... -> ...
...
_ -> ...
其中一个案件有一个后卫:
case x of
... -> ...
... -> ...
... | condition -> ...
-- If condition is false, fall through to “Rest”.
-- Rest:
... -> ...
... -> ...
...
_ -> ...
如果保护不匹配,我们只是通过其余的案例,没有问题。但现在我需要单点测试,所以我这样做:
case x of
... -> ...
... -> ...
... -> do
condition <- action
if condition
then ...
else ... -- How to fall through?
-- Rest:
... -> ...
... -> ...
...
_ -> ...
但是,我认为我犯了一个失误。似乎没有办法让else
分支继续处理其余的情况,而不复制这些分支或将它们分解为函数。无论哪种方式,都要进行详尽的检查:如果我想在警卫之后添加一个案例,编译器不知道这些匹配是否详尽无遗。
如何更改此函数或parameterise/wrap数据类型以使用monadic guard来详尽检查?
我想你已经迷茫了自己。如果“Bar”匹配,则只会输入警卫(或“if-then-else”)。如果“Bar”匹配(并且达到了条件),那么您已经知道'Baz','Quux'等不匹配,因此没有理由继续使用'case'块。 –
@BenjaminHodgson:很好。更新了示例。我使用一对值进行操作,并且对于后面的情况仍然可以匹配。 –
不,不是。你能提供你正在使用的**实际案例,而不是一个名称,而实际上并没有显示你在做什么? – Bakuriu