繁体   English   中英

使用案例进行多方式if

[英]Using case for a multi-way if

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

case () of
  _ | x < 15 -> ...
  _ | x < 25 -> ...
  _ | x < 50 -> ...
  _          -> ...

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

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

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

也有人提到, case是否存在,如果罚款和辑阵路,但我通过去哪儿为本地功能或让语句:

someFunction = do
    x <- monadicOp
    let f y | y < 5  = expr1
            | y < 15 = expr2
            | y < 25 = expr3
            | True   = expr4
    f x

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

编辑:

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

someFunction = do
    x <- monadicOp
    let r | x < 15 = expr1
          | x < 25 = expr2
    r

你可以利用懒惰的评估来得到这样的东西:

import Data.List
import Data.Maybe
import Control.Applicative

cases :: [(Bool,a)] -> a -> a
cases lst d = snd $ fromJust $ (find fst lst) <|> Just (True,d)

main = do
  let x = 20
      r = cases [(x < 15, putStr "15"),
                 (x < 25, putStr "25"),
                 (x < 50, putStr "50")] $ putStr "None"
    in
       r

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM