【发布时间】:2018-04-15 18:41:44
【问题描述】:
我有一个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 分支继续处理剩余的案例,而不复制这些分支或将它们分解为一个函数。无论哪种方式都会导致穷举检查:如果我想在保护之后添加一个案例,编译器不知道匹配是否穷举。
如何更改此函数,或参数化/包装数据类型,以使用一元守卫进行详尽检查?
【问题讨论】:
-
我想你自己搞糊涂了。如果
Bar匹配,您将只输入守卫(或if-then-else)。如果Bar匹配(并且您达到了条件),那么您已经知道Baz、Quux等不匹配,因此没有理由继续使用case块。 -
@BenjaminHodgson:很好。更新了示例。我正在对一对值进行操作,以后的情况仍有可能匹配。
-
不,不是。您能否只提供您正在使用的实际案例,而不是一个编造的名称,但实际上并没有显示您在做什么?
-
@Bakuriu:真实的代码比较复杂,我不知道它是否真的相关,但我可以稍后更新示例。实际上,我有一个构造函数
:@,而我的Bar案例实际上是Ctor "Join" :@ a :@ b上的匹配项,它在匹配a :@ b的更通用案例之前出现。 -
@JonPurdy 您不必发布您的真实代码,但您需要发布一个实际可执行示例来演示问题。
标签: haskell pattern-matching monads