案例中下划线的含义()

时间:2016-08-01 09:19:40

标签: haskell switch-statement

所以我已经看到了

的语法
case () of _
   | someBool ->
   | someOtherBool ->

我明白它的作用,例如完全独立于案例评估的事物切换案例(这是有道理的,因为在这种情况下,它将是单位,并且它将始终是单位)。

我也明白,这可以和(应该)独立于用case检查的东西(例如(1 == 1)(someComplexFunction)),但显然单位是最快的。

我不太了解的是,下划线是如何工作的。它清楚地告知案例完全忽略操作数的内容,只检查布尔值。但是这个运营商来自哪里?在其他情况下我可以使用它吗?

1 个答案:

答案 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'