getMultiWordPortion :: String -> String
getMultiWordPortion (x:':':xs) = xs
getMultiWordPortion _ = ""
这段代码中模式匹配的预期结果是,第一个冒号之前的所有内容都分配给 x,之后的所有内容都分配给 xs,这就是结果。如果没有冒号,则不返回任何内容。
我正在使用的示例字符串(“PING :gibson.freenode.net” - 它是 IRC 客户端的一部分)实际发生的情况是我得到了空白返回值。
我在这里做错了什么?
最佳答案
模式x:':':xs
表示“第一个字符是 x
,第二个字符是 ':'
其余字符在列表中 xs
”。所以这意味着 x
的类型是 Char
,而不是 [Char]
并且该模式仅在冒号前只有一个字符时才匹配。
没有办法在列表上使用模式匹配来表示“匹配一个子列表,然后是一个元素,然后是剩余的列表”。
要获取第一个冒号后的子字符串,您可以使用 dropWhile (/= ':') theString
.这将包括冒号,所以使用 tail
或模式匹配将其删除。
关于字符串上的 Haskell 模式匹配 - 为什么这不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3646128/