2013-10-25 262 views
4

如果我有一個函數,將一個字符串說返回一個int,我可以匹配字符串的第一個字符,使用模式匹配:模式匹配,匹配多個字符

f :: String -> Int 
f ('A' : _) = 1 
f ('B' : _) = 0 
f ('C' : _) = 1 
f _ = 2 

是有辦法匹配A還是C? 喜歡的東西:

f :: String -> Int 
f ('A'||'C' : _) = 1 
f ('B' : _) = 0 
f _ = 2 

甚至這個(如果有一些計算,而不是僅僅返回constant_這將是有益的)

f :: String -> Int 
f ('A' : _) 
f ('C' : _) = 1 
f ('B' : _) = 0 
f _ = 2 

回答

6

Haskell沒有在模式匹配交替。你可以解決這個問題使用遞歸:

f :: String -> Int 
f ('A' : rest) = f ('C' : rest) 
f ('B' : _) = 0 
f ('C' : _) = 1 
f _ = 2 

您可以考慮使用守衛:

f ('B' : _) = 0 
f (x : _) | x `elem` "AC" = 1 
f _ = 2 
+0

在後面的例子中,您可以刪除否則 – Ingo

+0

好點,謝謝。 – Joni

4

Unfotunately你不能做到這一點,一個簡單的解決方案是

f (x:_) | x == 'A' || x == 'C' = 1 
     | x == 'B"    = 0 
     | otherwise   = 2 

f ('B':_) = 2 
f (x:_) | x == 'A' || x == 'C' = 1 
f _  = 0 

它使用衛士,但它不是非常模式匹配,它實際上就像是一條鏈條if s

我可能會寫爲

f ('A':_) = f "C" 
f ('C':_) = 1 
f ('B':_) = 0 
f _  = 2 
1

您可以假冒「或圖案」與連接在ghc ticket 3919一個quasiquote。

隨着即將發佈的(ghc-7.10?)pattern synonyms,您可能可以定義一個pattern p1 :| p2 = ???,它與上一個鏈接中的quasiquote做的脫糖相同。