Haskell - 如何对反斜杠字符进行模式匹配?

Haskell - how to pattern match on backslash character?

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

这是我的功能:

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"

如何匹配单个反斜杠?

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

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

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

否则,你只会匹配文字\

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