今天,我发现自己键入以下代码:
case () of
_ | x < 15 -> ...
_ | x < 25 -> ...
_ | x < 50 -> ...
_ -> ...
这个含义很直接,但只是感觉...... 错误来说case ()
。有人有更好的建议吗?
我想,因为我在x
上品牌,我本来可以写case x
。但这仍然让我没有任何实际的模式匹配;这都是关于守卫的。这仍然感觉很奇怪。
答案 0 :(得分:14)
case ()
没有错;除非你想使用像GHC multi-way-if这样的最近的句法和非标准扩展,否则它是你用这个用例的最佳选择。
答案 1 :(得分:14)
其他人已经提到case
如果存在的话,那就是好的和多路的,但我会通过where或let语句来寻找本地函数:
someFunction = do
x <- monadicOp
let f y | y < 5 = expr1
| y < 15 = expr2
| y < 25 = expr3
| True = expr4
f x
这在语法上比case语句解决方案更清晰,并且比multi-way更便携,如果。
编辑:
如果不清楚,当你定义受保护的函数(x
)时,如果要比较的值(在这种情况下为f
已经在范围内,那么你可以定义改为一个值:
someFunction = do
x <- monadicOp
let r | x < 15 = expr1
| x < 25 = expr2
r
答案 2 :(得分:2)
您可以利用延迟评估来得出类似的内容:
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