假设我有一个Haskell的表达,如:哈斯克尔模式匹配对称的情况下
foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a
有没有Haskell语法崩溃的情况下,所以我可以匹配模式,并指定bar a
为双方的反应如何?或者,我能得到它简洁吗?
假设我有一个Haskell的表达,如:哈斯克尔模式匹配对称的情况下
foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a
有没有Haskell语法崩溃的情况下,所以我可以匹配模式,并指定bar a
为双方的反应如何?或者,我能得到它简洁吗?
这和Haskell一样简洁。在ML中,有一种你想要的语法(通过编写多个模式,它们将相同的变量绑定,彼此相邻,由|
分隔,最后一个模式之后的主体),但是在Haskell中没有。
如果您的代码比您的示例更复杂,您可能需要使用Alternative
实例Maybe
和PatternGuards
扩展(Haskell2010的一部分)做类似的事情。
{-# LANGUAGE PatternGuards #-}
import Control.Applicative
foo (x, y) | Just a <- y <|> x = bar a
如果你不熟悉它,<|>
挑选最左边的Just
如果有一个返回Nothing
否则,造成的格局后卫失败。
一个重要的警告,但 - 此匹配更多的情况下比原来的码。 foo(Just x,Just y)会匹配,所以如果这不是你想要的,你必须确保在早期的情况下处理它。 – mokus
您可以使用-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
或根据需要查看之前数据标准化的。
参见http://stackoverflow.com/questions/5914965/patterns-for-symmetric-functions – kennytm