Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 模式匹配,匹配多个字符_Haskell_Pattern Matching - Fatal编程技术网

Haskell 模式匹配,匹配多个字符

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

如果我有一个接受字符串并返回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
甚至这个(如果有一些计算,而不仅仅是返回一个常量,这将非常有用)


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