[英]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.