替换 haskell 中的反斜杠

Replacing backslash in haskell

您好,我正在尝试删除子字符串 "\r",方法是在以下函数中将其替换为空字符串:

clean :: String -> String
clean ('\':'r':xs) = clean xs
clean (x:xs) = x : clean xs
clean "" = ""

但是当我 运行 它在测试输入上时:

main = do
    print (clean "test line\r\nnew test")

它不起作用,只是输出与输入字符串相同的字符串。现在奇怪的是,如果我用任何其他字符替换反斜杠,例如 ':' 它工作得很好:

clean :: String -> String
clean (':':'r':xs) = clean xs
clean (x:xs) = x : clean xs
clean "" = ""

main = do
    print (clean "test line:r\nnew test")

按预期输出 "test line\nnew test"。我怀疑我没有正确转义双反斜杠。例如代码:

main = do
    print '\'

输出 '\' 而不是 '\',但根据我的阅读, 应该 是逃避它的正确方法。我只是不知道我做错了什么,我错过了什么?

\r 是一个字符。当你这样处理它时它会起作用:

clean :: String -> String
clean ('\r':xs) = clean xs
clean (x:xs) = x : clean xs
clean "" = ""

只有当您想将实际的 \ 放入字符串文字时,才需要转义反斜杠。

"\r"是一个带有一个字符的字符串,反斜杠用来表示一个carriage return,就像双引号("…") 也不是字符串的 content 的一部分。

您可以通过以下方式过滤掉回车 return:

clean :: String -> String
clean = filter <b>('\r' /=)</b>