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