我目前正在尝试实现一种计算字符串中字符数和位数的方法。但是,如果我使用包含'\'字符的字符串,我会得到奇怪的结果。我猜这是因为反斜杠字符是一个转义字符。
以下是方法:
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”。因此,当我们的代码只有一个反斜杠并且为我生成字符串时,我需要一种能够在我的代码中处理这种情况的方法。欢呼声。
答案 0 :(得分:3)
你是正确的\
是Haskell的转义字符。如果打印出生成的字符串,答案可能会更明显:
main = mapM_ putStrLn [ "1234fd"
, "1234\fd"
, "123\4fd"
, "12\34fd"
, "1\234fd"
, "\1234fd"
]
...产量
1234fd
1234d
123fd
12"fd
1êfd
Ӓfd
如果您确实打算在字符串中添加反斜杠字符,则需要将其加倍:"\\"
将导致打印一个\
。