在 Haskell 中合并多个案例

Jiv*_*van 3 haskell pattern-matching

使用这样的case _ of语法:

fun a b c =
    case (a, b, c) of
        (Just True, Just _, _) -> foo
        (Just True, _, Just _) -> foo
        _                      -> bar
Run Code Online (Sandbox Code Playgroud)

我可以合并前两个条件并避免重复foo吗?

或者,有没有其他(更干净的)方式来表达我想运行foo当且仅当aisJust Truebor or cnot Nothing

Dan*_*ner 11

你可以这样做:

fun a b c = case (a, b <|> c) of
    (Just True, Just _) -> foo
    _ -> bar
Run Code Online (Sandbox Code Playgroud)

当然,这只是将额外的匹配隐藏在 中(<|>),但您必须向吹笛者支付一些时间。

如果bc不具有相同的类型,您可以使它们与名称错误的void.


chi*_*chi 6

让我用一个“无聊”的选择来补充其他答案:

fun a b c = let
   foo' = foo
   in case (a, b, c) of
      (Just True, Just _, _) -> foo'
      (Just True, _, Just _) -> foo'
      _                      -> bar
Run Code Online (Sandbox Code Playgroud)

这可能会也可能不会回答预期的问题,具体取决于实际目标。

如果目标是避免在 中写入两个模式case,这当然达不到目标。

相反,如果目标是避免重复foo,这可能是一个很长的表达式(例如,do某些 monad 中的长块),则通过为长表达式指定一个短名称来满足目标。