在Haskell中合并多个案例

在Haskell中合并多个案例,haskell,pattern-matching,Haskell,Pattern Matching,使用如下语法的大小写: fun a b c = case (a, b <|> c) of (Just True, Just _) -> foo _ -> bar fun a b c= 案件(a、b、c) (只是真的,只是…)->foo (没错,没错)——>foo _->bar 我是否可以合并前两个条件并避免重复foo 或者,如果且仅当a为Just True且b或c不是Nothing,是否有任何其他(更干净的)方式来表示我想要运行foo fun a b

使用如下语法的大小写:

fun a b c = case (a, b <|> c) of
    (Just True, Just _) -> foo
    _ -> bar
fun a b c=
案件(a、b、c)
(只是真的,只是…)->foo
(没错,没错)——>foo
_->bar
我是否可以合并前两个条件并避免重复
foo


或者,如果且仅当
a
Just True
b
c
不是
Nothing
,是否有任何其他(更干净的)方式来表示我想要运行
foo

fun a b c = case (a, b <|> c) of
    (Just True, Just _) -> foo
    _ -> bar
fun a b c=
(只是真的,只是)->foo
_->bar
当然,这只是在
()
中隐藏了额外的匹配项,但你必须在某个时候付钱给吹笛者

如果
b
c
的类型不相同,您可以使它们与名称不正确的一起使用。

不知道这看起来是否干净,但如果
也一样,您可以使用好的老朋友

fun a b c=
如果a==Just True&(isJust b | | isJust c)
然后是福
埃尔斯酒吧
或者使用警卫

fun a b c=
案例a
只对|只对b | |只对c->foo
_->bar
没有案例:

fun(Just True)bc | isJust b | | isJust c=foo
乐趣=酒吧

一切都在使用,正如Daniel指出的那样,这些也会给吹笛者带来应得的(模式匹配)。

让我用一个“无聊”的替代方案来补充其他答案:

fun a b c = let
   foo' = foo
   in case (a, b, c) of
      (Just True, Just _, _) -> foo'
      (Just True, _, Just _) -> foo'
      _                      -> bar
这可能回答也可能不回答预期的问题,这取决于实际目标

如果目标是避免在
案例
中编写两个模式,那么这当然无法达到目标


相反,如果目标是避免重复
foo
,这可能是一个很长的表达式(例如,在某些monad中是一个长的
do
块),那么通过给长表达式起一个简短的名称,这就达到了目标。

您可以在大小写之前设置a
d=b或c
,然后对
(完全正确,并非一无所获)->foo
?@rturrado
也许
值在
时不起作用@chepner好的,谢谢;这是伪代码。我有一段时间没有用Haskell编程了。@rturrado你在道德上是对的:丹尼尔·瓦格纳下面的回答基本上遵循了你的方法。@chi-Haha,谢谢!我当时不知怎么帮了忙;-)在这里使用
if
很有意义,因为我们在
b
c
中不使用任何未包装的值-我们只是检查它们是否存在。