Haskell 字符串模式匹配 - 为什么这不起作用?
getMultiWordPortion :: String -> String
getMultiWordPortion (x:':':xs) = xs
getMultiWordPortion _ = ""
此代码中模式匹配的预期结果是第一个冒号之前的所有内容都分配给 x,之后的所有内容都分配给 xs,这就是结果。如果没有冒号,则不返回任何内容。
我正在使用的示例字符串(“PING :gibson.freenode.net” - 它是 IRC 客户端的一部分)实际发生的情况是我得到空白返回值。
我在这里做错了什么?
getMultiWordPortion :: String -> String
getMultiWordPortion (x:':':xs) = xs
getMultiWordPortion _ = ""
The expected result from pattern matching in this code is that everything before the first colon get's assigned to x, and everything afterwards gets assigned to xs, which is the result. If there is no colon, nothing is returned.
What actually happens with a sample string I'm using ("PING :gibson.freenode.net" - it's part of an IRC client) is that I get the blank return value.
What am I doing wrong here?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
:
运算符将 one 元素连接到列表的头部。您的模式将仅匹配冒号是列表中第二项的字符串。The
:
operator conses one element to the head of a list. Your pattern will only match a string where the colon is the second item in the list.模式
x:':':xs
表示“第一个字符是x
,第二个字符是':'
其余字符在列表xs
”。因此,这意味着x
的类型是Char
,而不是[Char]
,并且该模式仅在冒号之前恰好有一个字符时匹配。无法在列表上使用模式匹配来表示“匹配一个子列表,后跟一个元素,后跟其余列表”。
要获取第一个冒号之后的子字符串,可以使用 dropWhile (/= ':') theString。这将包括冒号,因此请使用
tail
或模式匹配将其删除。The pattern
x:':':xs
means "The first character isx
, the second character is':'
the remaining characters are in the listxs
". So this means that the type ofx
isChar
, not[Char]
and that the pattern only matches if there's exactly one character before the colon.There is no way to use pattern matching on lists to say "match one sublist, followed by an element, followed by the remaining list".
To get the substring after the first colon you can use
dropWhile (/= ':') theString
. This will include the colon, so usetail
or pattern matching to remove it.