2013-03-02 90 views
6

我已经像组的情况下,表达式匹配

a = 3 

对于的一些的值的变量,我也有同样功能我想调用:

case a of 
    3 -> print "hello" 
    4 -> print "hello" 
    5 -> print "hello" 
    6 -> print "hello something else" 

所以对于α= 3,一个= 4和a = 5我进行相同的函数调用。 我可以将这些分组更好吗?我有点寻找一个解决方案,这将是:

case a of 
    3 || 4 || 5 -> print "hello" 
    6   -> print "hello something else" 

这当然不工作,但希望你能得到我想要结束的地方。

谢谢。

+0

如果Haskell允许你的建议,这将是一个很好的功能。 – augustss 2013-03-03 15:31:33

回答

13

如何

case a of 
    _ | a == 3 || a == 4 || a == 5 
     -> print "hello" 
    6 -> print "hello something else" 

那么单调乏味写会

case a of 
    _ | a `elem` [3, 4, 5] 
     -> print "hello" 
    6 -> print "hello something else" 

case a of 
    _ | 3 <= a && a <= 5 
     -> print "hello" 
    6 -> print "hello something else" 

,甚至,如果你真正的程序有很多可能的值你匹配,像这样的事情:

import qualified Data.Set as S 

valuesToMatchAgainst :: S.Set Int 
valuesToMatchAgainst = S.fromList [3, 4, 5] 

-- ... 

    case a of 
     _ | a `S.elem` valuesToMatchAgainst 
      -> print "hello" 
     6 -> print "hello something else" 

(我假定你明白已经是_是匹配任何值的通配符,而且| introduces a guard

+0

整洁!我只看到过一个函数定义的LHS守卫 - 不知道你可以在任何模式匹配中做到这一点。 – 2013-03-02 11:17:24

2

你可以做不同的事情,以改善你的代码。首先,如果所有分支调用同一个函数,那么为什么不:

print (case a of 
     3 -> "hello" 
     4 -> "hello" 
     5 -> "hello" 
     6 -> "hello something else") 

这个因素更多代码的共同行为。其次,你好像问了3,4,5例组合在一起,最好的办法可能是分解出一个分类功能:

let cat 3 = True 
    cat 4 = True 
    cat 5 = True 
    cat 6 = False 
in print (case cat a of True -> "hello" 
         False -> "hello something else") 

可以由以前的海报建议的替代方案的一个结合本(cat x = x elem [3,4,5]等)。