Haskell 大小写表达式中的组匹配

Haskell 大小写表达式中的组匹配,haskell,Haskell,我有一个变量,比如 a = 3 对于a的某些值,我有相同的函数要调用: case a of 3 -> print "hello" 4 -> print "hello" 5 -> print "hello" 6 -> print "hello something else" 对于a=3,a=4和a=5,我进行相同的函数调用。 我能把这些更好地分组吗?我在寻找一个解决方案,它是: case a of 3 || 4 || 5

我有一个变量,比如

a = 3
对于a的某些值,我有相同的函数要调用:

case a of
     3 -> print "hello"
     4 -> print "hello"
     5 -> print "hello"
     6 -> print "hello something else"
对于a=3,a=4和a=5,我进行相同的函数调用。 我能把这些更好地分组吗?我在寻找一个解决方案,它是:

case a of
     3 || 4 || 5 -> print "hello"
     6           -> print "hello something else"
这当然行不通,但希望你能达到我想要的结果

谢谢。

怎么样

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"


(我想您已经了解了
是一个与任何值都匹配的通配符。)

您可以做不同的事情来改进代码。首先,如果所有分支都调用相同的函数,那么为什么不:

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]
等)。

整洁!我只在函数定义的LHS上见过守卫——我不知道在任何模式匹配中都可以做到。如果Haskell允许您的建议,这将是一个很好的特性。
print (case a of 
         3 -> "hello"
         4 -> "hello"
         5 -> "hello"
         6 -> "hello something else")
 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")