首页 > 解决方案 > Haskell - 如何对反斜杠字符进行模式匹配?

问题描述

我想用使用模式匹配的递归函数用字符串中的空格替换 \n,但我不知道如何匹配 \ 字符。

这是我的功能:

replace :: String -> String
replace ('\\':'n':xs) = ' ' : replace xs
replace (x:xs) = x : replace xs
replace "" = ""

('\':'n':xs)反斜杠中会转义单引号并弄乱代码,所以我写('\\':'n':xs)期望第一个 \ 将转义第二个 \ 并匹配字符串中的反斜杠。然而,事实并非如此。

这就是我在 GHCi 中尝试该功能时发生的情况:

*Example> replace "m\nop"
"m\nop"
*Example> replace "m\\nop"
"m op"

如何匹配单个反斜杠?

标签: haskellpattern-matching

解决方案


\n是单个字符。如果我们\n在类似的字符串中使用"Hello\nWorld!",那么结果列表如下所示['H','e','l','l','o','\n','W','o','r','l','d','!']\n表示换行符,单个 ASCII 字节10。但是,由于在许多编程语言中输入换行符并不容易,因此\n在字符串文字中使用了转义序列。

如果要在换行符上进行模式匹配,则必须使用整个转义序列:

replace :: String -> String
replace ('\n':xs) = ' ' : replace xs
replace (x:xs)    = x   : replace xs
replace ""        = ""

否则,您将只匹配文字\

练习:现在replace可行,尝试使用map而不是显式递归。


推荐阅读