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 中给出了字符和字符串文字语法的完整描述。
到目前为止我有我的 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 中给出了字符和字符串文字语法的完整描述。