假设我有一个像以下一样的haskell表达式:
foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a
是否有任何haskell语法来折叠这些情况,因此我可以匹配任一模式并指定bar a
作为两者的响应?或者这简直就像我能得到它一样简洁?
答案 0 :(得分:8)
如果您的代码比您的示例更复杂,您可能希望使用Alternative
实例Maybe
和PatternGuards
扩展(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
或者您希望在查看之前规范化数据。