Haskell模式匹配对称情形

Haskell模式匹配对称情形,haskell,syntax,pattern-matching,Haskell,Syntax,Pattern Matching,假设我有一个haskell表达式,如: foo (Nothing, Just a) = bar a foo (Just a, Nothing) = bar a 是否有任何haskell语法来折叠这些情况,以便我可以匹配其中一种模式并指定bar a作为这两种模式的响应?或者这是我所能做到的最简洁的吗?这是哈斯克尔所能做到的最简洁的。在ML中,有一种你想要的语法(通过编写多个模式,这些模式将相同的变量绑定在一起,彼此之间用|分隔,并在最后一个模式后加上主体),但在Haskell中没有。如果你的代码

假设我有一个haskell表达式,如:

foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a

是否有任何haskell语法来折叠这些情况,以便我可以匹配其中一种模式并指定
bar a
作为这两种模式的响应?或者这是我所能做到的最简洁的吗?

这是哈斯克尔所能做到的最简洁的。在ML中,有一种你想要的语法(通过编写多个模式,这些模式将相同的变量绑定在一起,彼此之间用
|
分隔,并在最后一个模式后加上主体),但在Haskell中没有。

如果你的代码比你的示例更复杂,你可能需要这样做,为
Maybe
PatternGuards
扩展(Haskell 2010的一部分)使用
替代
实例

{-#语言模式卫士}
导入控制

foo(x,y)|只是一个,您可以使用
-XViewPatterns
,添加任意函数以将两个案例折叠为一个模式。 您的模式现在是一个函数
p
,它生成您想要匹配的内容:

foo (p -> (Just a, Nothing)) = bar a
简单多了

我们必须将
p
定义为:

p (Nothing, a@(Just _)) = (a, Nothing)
p a@(Just _,   Nothing) = a
p a                     = a
或者,您希望在查看之前规范化数据



参考资料:

另请参见一个重要的警告-这比原始代码匹配更多的情况。foo(只是x,只是y)是匹配的,所以如果这不是您想要的,那么您必须确保在早期案例中处理它。
p (Nothing, a@(Just _)) = (a, Nothing)
p a@(Just _,   Nothing) = a
p a                     = a