字符串上的Haskell模式匹配 - 为什么这不起作用?

时间:2010-09-05 12:59:59

标签: haskell pattern-matching

getMultiWordPortion :: String -> String
getMultiWordPortion (x:':':xs) = xs
getMultiWordPortion _ = ""

此代码中模式匹配的预期结果是第一个冒号之前的所有内容都被分配给x,之后的所有内容都被分配给xs,这就是结果。如果没有冒号,则不返回任何内容。

我正在使用的示例字符串(“PING:gibson.freenode.net” - 它是IRC客户端的一部分)实际发生的是我得到空白的返回值。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:16)

模式x:':':xs表示“第一个字符为x,第二个字符为':',其余字符位于列表xs”中。所以这意味着x的类型是Char,而不是[Char],并且只有在冒号前面只有一个字符时才会匹配模式。

无法在列表上使用模式匹配来表示“匹配一个子列表,后跟一个元素,然后是剩余列表”。

要获取第一个冒号后面的子字符串,可以使用dropWhile (/= ':') theString。这将包括冒号,因此请使用tail或模式匹配将其删除。

答案 1 :(得分:4)

:运算符将一个元素包含在列表的头部。您的模式只匹配冒号是列表中第二项的字符串。