Haskell 99 个问题 #10:'\' 符号的奇怪行为

Haskell 99 questions #10: strange behaviour of '\' symbol

到目前为止我有我的 99.hs 文件:

import Data.List

myEncode :: Eq a => [a] -> [(Int, a)]
myEncode = map (\x -> (length x, head x)) . group

但是当我尝试在 ghci 中使用它时,我得到了这个(虽然我试过了,但还没有找到解释):

*Main> myEncode "///aaaaabbbbbbbccdddddxxyyzz0"
[(3,'/'),(5,'a'),(7,'b'),(2,'c'),(5,'d'),(2,'x'),(2,'y'),(2,'z'),(1,'0')]                           │
*Main> myEncode "\\aaaaabbbbbbbccdddddxxyyzz0"
[(1,'\'),(1,'\a'),(4,'a'),(7,'b'),(2,'c'),(5,'d'),(2,'x'),(2,'y'),(2,'z'),(1,'0')]

任何 link 关于这个(当然,关于 haskell)的详尽资料都会很好,同时也是对这个问题的一个很好的解释。

有许多字符的转义码很难在普通键盘上键入,或者 Haskell 在编辑器中阅读起来会很烦人。因此,例如,制表符在 Haskell 代码中表示为 '\t',换行符表示为 '\n',等等。为了表示文字反斜杠,需要对其进行转义,因此 '\';并且 '\a' 恰好也是一个转义字符(对于铃控制字符,是不文明时代的不雅残余)。

因此字符串 "\\a" 表示一个双字符列表,第一个元素包含反斜杠字符,第二个元素包含响铃控制字符。

the Report 中给出了字符和字符串文字语法的完整描述。