字符串更改输出中的反斜杠

时间:2016-12-15 18:12:49

标签: string haskell recursion

我目前正在尝试实现一种计算字符串中字符数和位数的方法。但是,如果我使用包含'\'字符的字符串,我会得到奇怪的结果。我猜这是因为反斜杠字符是一个转义字符。

以下是方法:

import Data.Char

countLettersAndDigits :: String -> Int
countLettersAndDigits [] = 0
countLettersAndDigits (x:xs) = if isDigit x == True || isLetter x == True 
                               then 1 + countLettersAndDigits xs 
                               else countLettersAndDigits xs 

以下是一组输入及其各自的结果:

  

“1234fd” - > 6(不包含'\')

     

“1234f \ d” - >字符串中的字符串/字符文字中的词法错误   'd'

     

“1234 \ fd” - > 5

     

“123 \ 4fd” - > 5

     

“12 \ 34fd” - > 4

     

“1 \ 234fd” - > 4

     

“\ 1234fd” - > 3

我觉得很奇怪,例如,“1234 \ fd”和“123 \ 4fd”都会给出5个结果。

任何帮助解释为什么这可能是这种情况,以及如何解决这个问题?会很棒的!

干杯。

修改

我忘了提到我上面使用的字符串只是我正在玩的一个例子。 Quick Check正在生成导致问题的实际字符串。字符串是“\ 178”。因此,当我们的代码只有一个反斜杠并且为我生成字符串时,我需要一种能够在我的代码中处理这种情况的方法。欢呼声。

1 个答案:

答案 0 :(得分:3)

你是正确的\是Haskell的转义字符。如果打印出生成的字符串,答案可能会更明显:

main = mapM_ putStrLn [ "1234fd"
                      , "1234\fd"
                      , "123\4fd"
                      , "12\34fd"
                      , "1\234fd"
                      , "\1234fd"
                      ]

...产量

1234fd
1234d
123fd
12"fd
1êfd
Ӓfd

如果您确实打算在字符串中添加反斜杠字符,则需要将其加倍:"\\"将导致打印一个\

你可以read up on escape sequences here