使用案例进行多方式if

时间:2013-07-04 20:42:32

标签: haskell coding-style

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

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

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

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

3 个答案:

答案 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