微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何处理字符串haskell中以'\'结尾的文件

如何解决如何处理字符串haskell中以'\'结尾的文件

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 代码,当我尝试直接传递文件结尾时出错

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 | '\\' = '\\'

这将让您的代码解析,尽管一旦您通过它,还有进一步的错误需要修复。

* 是的,是的,字符串间隙。我知道。实际上并没有改变这一点,因为间隙中的换行符不包含在结果字符串中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。