Haskell - 字面反斜杠总是必须在字符串中转义吗?

时间:2010-09-25 02:50:43

标签: string haskell

在Haskell中,为了表示文字字符串"\",人们通常会写:

"\\"

但是,有没有办法逃避字符串,以便单个反斜杠可以自己编写而无需转义?例如,我可以在C#中通过预先挂起的@对字符串执行此操作:

@"\"

Haskell是否具有等价物?

3 个答案:

答案 0 :(得分:5)

不,请参阅Haskell Lexical Structure的第2.6节。

Haskell没有原始字符串,heredocs或三重字符串。抱歉。你得到的唯一的好处是:

  "ab\
  \cd"

=> 

"abcd"

忽略行结尾和开始斜杠之间的空格。例如,如果要发出一些在Haskell源中正确缩进但不在输出中过度缩进的内联HTML,这很有用。 (不是说我主张以这种方式做复杂的HTML输出。)

答案 1 :(得分:3)

有一个很好的library (raw-strings-qq)可以为你提供QuasiQouter

import Text.RawString.QQ

multiline :: String
multiline = [r|<HTML>
<HEAD>
<TITLE>Auto-generated html formated source</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
</HEAD>
<BODY LINK="800080" BGCOLOR="#ffffff">
<P> </P>
<PRE>|]

答案 2 :(得分:2)

由于QuasiQuoting机制,可以使用标准的haskell:

http://www.haskell.org/haskellwiki/Poor_man%27s_here_document#Quasiquoting

那样,没有问题了。唯一的问题是,现在你必须注意终止准规则序列的|],你可能必须逃避。在正则表达式的上下文中,我使用\ u7c或类似的东西自己逃脱了,我不记得确切。所以我使用unicode或ASCII代码作为管道字符。但是这个|]序列并不经常出现。

如果您对此感兴趣,请输入正则表达式,我是Rex库的忠实粉丝:

http://hackage.haskell.org/package/rex

其中不仅使用quasiquoting进行漂亮的正则表达式输入(没有双反斜杠),它还使用类似perl的正则表达式而不是默认烦人的POSIX正则表达式,甚至允许你使用正则表达式作为模式匹配你的方法参数,这是天才。