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
而不是显式递归。
我想用模式匹配的递归函数将字符串中的 \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
而不是显式递归。