案例中下划线的含义()

Abr*_*m P 6 haskell switch-statement

所以我已经看到了周围的语法

case () of _
   | someBool ->
   | someOtherBool ->
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dav*_*vid 12

正如@Rhymoid在评论中所说,它只是一个模式匹配,没有任何约束,它可以被一个名称(将被绑定)取代.写这样可能更清楚:

case () of
  _ | someBool -> ...
    | somOtherBool -> ...
Run Code Online (Sandbox Code Playgroud)

这也可以写成(或多或少等价)

case () of
  () | someBool -> ...
     | someOtherBool -> ...
Run Code Online (Sandbox Code Playgroud)

这些是守卫.您还可以在更复杂的case比赛中使用后卫:

case m of
  Just x
    | someBool -> ...
    | someOtherBool -> ...
  Nothing
    | someThirdBool -> ...
    | someFourthBool -> ...
Run Code Online (Sandbox Code Playgroud)

在每场比赛中尽可能多的后卫.

编写你给出的代码的原因是获得一个简洁的if-then-else风格的东西,有几种可能性.在MultiWayIf启用扩展的情况下可以更好地编写原始代码:

{-# LANGUAGE MultiWayIf #-}
...
  if | someBool -> ...
     | someOtherBool -> ...
Run Code Online (Sandbox Code Playgroud)

MultiWayIf 也可以与原始代码一样使用任意数量的布尔"情况".

对于您以后不需要该值的任何模式,可以在任何模式匹配中使用下划线.例如:

andBool True True = True
andBool _    _    = False
Run Code Online (Sandbox Code Playgroud)

要么

f (Just _) = 'J'
f _        = 'N'
Run Code Online (Sandbox Code Playgroud)