2013-03-02 103 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]等)。

相關問題