Haskell模式匹配对称案例

时间:2011-05-11 18:35:36

标签: haskell syntax pattern-matching

假设我有一个像以下一样的haskell表达式:

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

是否有任何haskell语法来折叠这些情况,因此我可以匹配任一模式并指定bar a作为两者的响应?或者这简直就像我能得到它一样简洁?

3 个答案:

答案 0 :(得分:8)

如果您的代码比您的示例更复杂,您可能希望使用Alternative实例MaybePatternGuards扩展(Haskell2010的一部分)来执行此类操作。

{-# LANGUAGE PatternGuards #-}
import Control.Applicative

foo (x, y) | Just a <- y <|> x = bar a

如果你不熟悉它,<|>会选择最左边的Just(如果有的话),否则返回Nothing,导致模式保护失败。

答案 1 :(得分:5)

这就像在Haskell中一样简洁。在ML中有一个你想要的语法(通过编写多个模式,它们绑定相同的变量,彼此相邻,由|与最后一个模式之后的主体隔开),但在Haskell中没有。< / p>

答案 2 :(得分:4)

您可以使用-XViewPatterns添加任意功能,将两个案例合并为一个模式。 您的模式现在是一个函数p,它产生您想要匹配的东西:

foo (p -> (Just a, Nothing)) = bar a

更简单!

我们必须定义p,但是:

p (Nothing, a@(Just _)) = (a, Nothing)
p a@(Just _,   Nothing) = a
p a                     = a

或者您希望在查看之前规范化数据。


参考文献: GHC User's Guide chapter on View Patterns