Haskell模式匹配对称案例

ram*_*ion 8 syntax haskell pattern-matching

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

foo (Nothing, Just a) = bar a
foo (Just a, Nothing) = bar a
Run Code Online (Sandbox Code Playgroud)

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

ham*_*mar 8

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

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

foo (x, y) | Just a <- y <|> x = bar a
Run Code Online (Sandbox Code Playgroud)

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

  • 一个重要的警告 - 这比原始代码匹配更多的情况.foo(Just x,Just y)会匹配,所以如果那不是你想要的,你必须确保在之前的情况下处理它. (2认同)

sep*_*p2k 5

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