Haskell 模式匹配,匹配多个字符
如果我有一个接受字符串并返回int的函数,我可以使用模式匹配来匹配字符串的第一个字符:Haskell 模式匹配,匹配多个字符,haskell,pattern-matching,Haskell,Pattern Matching,如果我有一个接受字符串并返回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 甚至这个(如果有一些计算,而不仅仅是返回一个常量,这将非常有用) Ha
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
甚至这个(如果有一些计算,而不仅仅是返回一个常量,这将非常有用)
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
如果你不能做到这一点,一个简单的解决方案是
f (x:_) | x == 'A' || x == 'C' = 1
| x == 'B" = 0
| otherwise = 2
f ('B':_) = 2
f (x:_) | x == 'A' || x == 'C' = 1
f _ = 0
这使用了防护装置,但它不是非常匹配-y模式,它实际上就像一个if
s链
我可能会这样写
f ('A':_) = f "C"
f ('C':_) = 1
f ('B':_) = 0
f _ = 2
你可以用一个附加在上的准音符来伪造“或图案”
在即将发布的(ghc-7.10?)中,您可能能够定义一个
模式p1:| p2=???
,该模式与上一个链接中的Quasikote进行相同的脱糖操作。在后一个示例中,您可以直接删除另一个模式
f ('A':_) = f "C"
f ('C':_) = 1
f ('B':_) = 0
f _ = 2