7

我有一个变量

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"

这当然行不通,但希望你能得到我想要的结果。

谢谢。

4

2 回答 2

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"

(我假设您已经了解这_是一个匹配任何值的通配符,并且它|引入了一个 guard。)

于 2013-03-02T10:59:16.383 回答
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 = xelem[3,4,5]等)建议的替代方案之一结合使用。

于 2013-03-02T12:55:06.780 回答