所以我已经看到了
的语法case () of _
| someBool ->
| someOtherBool ->
我明白它的作用,例如完全独立于案例评估的事物切换案例(这是有道理的,因为在这种情况下,它将是单位,并且它将始终是单位)。
我也明白,这可以和(应该)独立于用case检查的东西(例如(1 == 1)(someComplexFunction)),但显然单位是最快的。
我不太了解的是,下划线是如何工作的。它清楚地告知案例完全忽略操作数的内容,只检查布尔值。但是这个运营商来自哪里?在其他情况下我可以使用它吗?
答案 0 :(得分:12)
正如@Rhymoid在评论中所说,它只是一个模式匹配,没有任何约束,它可以被一个名称(将被绑定)取代。写这样可能更清楚:
case () of
_ | someBool -> ...
| somOtherBool -> ...
这也可以写成(或多或少等同于)
case () of
() | someBool -> ...
| someOtherBool -> ...
这些是守卫。您还可以在更复杂的case
匹配中使用警卫:
case m of
Just x
| someBool -> ...
| someOtherBool -> ...
Nothing
| someThirdBool -> ...
| someFourthBool -> ...
每场比赛都有你想要的后卫。
编写你给出的代码的原因是获得一个简洁的if-then-else风格的东西,有几种可能性。使用MultiWayIf
扩展程序可以更好地编写原始代码:
{-# LANGUAGE MultiWayIf #-}
...
if | someBool -> ...
| someOtherBool -> ...
MultiWayIf
也可以与任意数量的布尔“案例”一起使用,就像原始代码一样。
对于您以后不需要该值的任何模式,可以在任何模式匹配中使用下划线。例如:
andBool True True = True
andBool _ _ = False
或
f (Just _) = 'J'
f _ = 'N'