问题描述
import Data.Char (isAlpha)
import Data.List (elemIndex)
import Data.Maybe (fromJust)
helper = ['a'..'z'] ++ ['a'..'z'] ++ ['A'..'Z'] ++ ['A'..'Z']
rotate :: Char -> Char
rotate x | '\' = '\'
|isAlpha(x) = helper !! (fromJust (elemIndex x helper) + 13)
| otherwise = x
rot13 :: String -> String
rot13 "" = ""
rot13 s = map rotate s
main = do
print $ rot13( "hey fellow warriors" )
print $ rot13( "This is a test")
print $ rot13( "This is another test" )
print $ rot13("\604099\159558\705559&\546452\390142")
n <- getLine
print $ rot13( show n)
rot13.hs:8:15: error:
lexical error in string/character literal at character ' '
|
8 | rotate x | '\' = '\'
即使不替换也有错误,只是使用 isAlpha 过滤
如何处理?
解决方法
在许多语言中,反斜杠是转义字符。它用于引入以其他方式难以或不可能包含在字符串中的字符。例如,字符串不能跨越多行*,因此不可能在字符串文字中包含文字换行符;和双引号结束字符串,因此通常不可能在字符串文字中包含双引号。 \n
和 \"
转义分别涵盖:
> putStrLn "before\nmiddle\"after"
before
middle"after
>
由于 \
引入了转义码,它总是期望后面跟着一些东西。如果您希望在该位置包含文字反斜杠,则可以使用第二个反斜杠。例如:
> putStrLn "before\\after"
before\after
>
Report,Section 2.6 是关于可用转义符及其含义的最后一句话。
文字字符具有类似(虽然不完全相同)的字符串转义集合。所以对你的语法的修复看起来像这样:
rotate x | '\\' = '\\'
这将让您的代码解析,尽管一旦您通过它,还有进一步的错误需要修复。
* 是的,是的,字符串间隙。我知道。实际上并没有改变这一点,因为间隙中的换行符不包含在结果字符串中。