今天,我发现自己输入了以下代码:
case () of
_ | x < 15 -> ...
_ | x < 25 -> ...
_ | x < 50 -> ...
_ -> ...
这句话的意思很直截了当,但就是感觉……说错了case ()
。有人有更好的建议吗?
我想既然我在打品牌x
,我本来可以写case x
的。但这仍然让我无法真正进行模式匹配;这都是关于警卫的。这仍然感觉很奇怪。
今天,我发现自己输入了以下代码:
case () of
_ | x < 15 -> ...
_ | x < 25 -> ...
_ | x < 50 -> ...
_ -> ...
这句话的意思很直截了当,但就是感觉……说错了case ()
。有人有更好的建议吗?
我想既然我在打品牌x
,我本来可以写case x
的。但这仍然让我无法真正进行模式匹配;这都是关于警卫的。这仍然感觉很奇怪。
没有错case ()
;除非您想使用最新的句法和非标准扩展,例如 GHC 的multi-way-if ,否则这是您对这个用例的最佳选择。
其他人已经提到,如果存在的话,case
如果罚款和多路存在,但我会通过 where 或 let 语句来获取本地函数:
someFunction = do
x <- monadicOp
let f y | y < 5 = expr1
| y < 15 = expr2
| y < 25 = expr3
| True = expr4
f x
这在语法上比 case 语句解决方案更干净,并且比多路 if 更可移植。
编辑:
如果不清楚,如果x
在这种情况下,当您定义受保护的函数 ( f
) 时,正在比较的值已经在范围内,那么您可以只定义一个值:
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