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

Wil*_*elm 4 haskell pattern-matching

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

这是我的功能:

replace :: String -> String
replace ('\\':'n':xs) = ' ' : replace xs
replace (x:xs) = x : replace xs
replace "" = ""
Run Code Online (Sandbox Code Playgroud)

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

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

*Example> replace "m\nop"
"m\nop"
*Example> replace "m\\nop"
"m op"
Run Code Online (Sandbox Code Playgroud)

如何匹配单个反斜杠?

Zet*_*eta 5

\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 ""        = ""
Run Code Online (Sandbox Code Playgroud)

否则,您将只匹配文字\.

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