使用案例进行多方式if

Mat*_*hid 16 haskell coding-style

今天,我发现自己键入以下代码:

case () of
  _ | x < 15 -> ...
  _ | x < 25 -> ...
  _ | x < 50 -> ...
  _          -> ...
Run Code Online (Sandbox Code Playgroud)

这个意思很直接,但只是感觉...... 说错case ().有没有人有更好的建议?

我想,因为我在品牌上x,我本来可以写的case x.但这仍然让我没有任何实际的模式匹配; 这都是关于守卫的.这仍然感觉很奇怪.

Joa*_*ner 14

没有错case (); 除非你想使用最近的语法和非标准扩展,如GHC的multi-way-if,否则它是你对这个用例最好的.


Tho*_*son 14

其他人已经提到case如果存在精细和多路,但我会通过where或let语句来寻找本地函数:

someFunction = do
    x <- monadicOp
    let f y | y < 5  = expr1
            | y < 15 = expr2
            | y < 25 = expr3
            | True   = expr4
    f x
Run Code Online (Sandbox Code Playgroud)

这在语法上比case语句解决方案更清晰,并且比multi-way更便携.

编辑:

如果不清楚,x在这种情况下,当你定义受保护的函数(f)时,被比较的值是否已经在范围内,那么你可以改为定义一个值:

someFunction = do
    x <- monadicOp
    let r | x < 15 = expr1
          | x < 25 = expr2
    r
Run Code Online (Sandbox Code Playgroud)