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

时间:2015-08-13 20:21:14

标签: haskell literals

到目前为止,我有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')]

关于此问题的详尽来源(当然,关于haskell)的任何链接都会很好,也是对这个问题的一个很好的解释。

1 个答案:

答案 0 :(得分:7)

在普通键盘上很难输入的字符有很多转义码,或者会让Haskell在编辑器中读取很烦人。因此,例如,制表符在Haskell代码中表示为'\t',换行符由'\n'表示,依此类推。为了表示一个字面反斜杠,一个人逃避它,因此'\\';而且'\a'恰好也是一个逃避角色(对于钟控制角色来说,这是一个文明年龄较低的残余部分)。

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

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