2011-05-11 60 views
8

假设我有一个Haskell的表达,如:哈斯克尔模式匹配对称的情况下

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

有没有Haskell语法崩溃的情况下,所以我可以匹配模式,并指定bar a为双方的反应如何?或者,我能得到它简洁吗?

+0

参见http://stackoverflow.com/questions/5914965/patterns-for-symmetric-functions – kennytm

回答

5

这和Haskell一样简洁。在ML中,有一种你想要的语法(通过编写多个模式,它们将相同的变量绑定,彼此相邻,由|分隔,最后一个模式之后的主体),但是在Haskell中没有。

8

如果您的代码比您的示例更复杂,您可能需要使用Alternative实例MaybePatternGuards扩展(Haskell2010的一部分)做类似的事情。

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

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

如果你不熟悉它,<|>挑选最左边的Just如果有一个返回Nothing否则,造成的格局后卫失败。

+2

一个重要的警告,但 - 此匹配更多的情况下比原来的码。 foo(Just x,Just y)会匹配,所以如果这不是你想要的,你必须确保在早期的情况下处理它。 – mokus

4

您可以使用-XViewPatterns添加任意函数以将您的两种情况折叠为单个模式。 你现在的模式是一个功能p能产生要匹配的东西:

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

简单多了!

我们要定义p不过,因为:

p (Nothing, [email protected](Just _)) = (a, Nothing) 
p [email protected](Just _, Nothing) = a 
p a      = a 

或根据需要查看之前数据标准化的。


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