16

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

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

这句话的意思很直截了当,但就是感觉……说错case ()。有人有更好的建议吗?

我想既然我在打品牌x,我本来可以写case x的。但这仍然让我无法真正进行模式匹配;这都是关于警卫的。这仍然感觉很奇怪。

4

3 回答 3

14

没有错case ();除非您想使用最新的句法和非标准扩展,例如 GHC 的multi-way-if ,否则这是您对这个用例的最佳选择。

于 2013-07-04T21:22:09.670 回答
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 语句解决方案更干净,并且比多路 if 更可移植。

编辑:

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

someFunction = do
    x <- monadicOp
    let r | x < 15 = expr1
          | x < 25 = expr2
    r
于 2013-07-04T21:58:28.393 回答
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
于 2013-07-05T04:36:22.133 回答