如何在Haskell中转义双引号?

10

我知道在 Haskell 中,要转义特殊字符,我们可以使用 \"。因此,如果我尝试将以下内容作为参数传递:

parseString :: String
parseString = "{\"coord\":[\"D\",\"7\"],\"result\":\"HIT\",\"prev\":{\"coord\":[\"A\",\"10\"],\"result\":null,\"prev\":null}}"

传递给函数

take 7 parseString

一切都很好,但我在想是否有更短的方法来产生相同的结果,而不必在每个地方都加上转义符号\"(想象一下大型JSON)?

例如,Python就有这个:

>>> s = """my string with "double quotes" blablabla"""
'my string with "double quotes" blablabla'

3
有一些使用 Haskell 的 quasiquotes 功能来帮助生成原始字符串的包。 - Willem Van Onsem
2
根据应用程序的不同,您还可以考虑ASCII双引号字符是否真的是最好的选择。例如,许多标记语言和动态语言(尽管不包括JSON)也允许在字符串中使用单引号。而且,如果引号实际上应该出现在可读的文本中,那么您应该使用Unicode “U+201C LEFT DOUBLE QUOTATION MARK”U+201D RIGHT DOUBLE QUOTATION MARK。所有这些都可以出现在Haskell字符串文字中,无需任何转义。 - leftaroundabout
2个回答

15

您可以使用反斜杠(\)来转义字符串中的双引号(\"),例如:

"\"To be, or not to be\" - William Shakespeare"

当需要写很多双引号时,上述方法可能会变得相当繁琐。Haskell使用quasiquotes方式,许多Haskell软件包使用该方式在Haskell内部开发“迷你语言”。据我所知,Quasiquotes并未在Haskell报告中指定,因此这并不是真正的“Haskell功能”,但最流行的编译器(GHC)支持此功能。像raw-strings-qq [Hackage]这样的软件包允许您利用此功能编写原始字符串,如下所示:

{-# LANGUAGE QuasiQuotes #-}

import Text.RawString.QQ(r)

quote = [r|"To be, or not to be" - William Shakespeare|]

这样就会产生像这样的字符串:

Prelude Text.RawString.QQ> [r|"To be, or not to be" - William Shakespeare|]
"\"To be, or not to be\" - William Shakespeare"

QuasiQuotes不仅用于生成原始字符串。例如,在Yesod中有一些迷你语言,用于使用莎士比亚语言(hamletluciuscassiusjulius)定义HTML/CSS/JavaScript模板。如果用“vanilla” Haskell 表达某些内容需要大量工作,通常会使用它,而在特定语言中编写则更容易。


3
提到Yesod和莎士比亚,shakespeare使用textstext的准引用器(quasiquoters)来实现这个目的。我将其翻译为:谈到Yesod和莎士比亚,shakespeare提供Text.Shakespeare.Text模块中的textstext准引用器(quasiquoters)以达到此目的。 - Cubic

10

使用\",这是在纯Haskell中没有其他方法的。例如:

λ> putStrLn "\""
"
λ> putStrLn "my string with \"double quotes\" blablabla"
my string with "double quotes" blablabla

您可以在Haskell 2010报告中很容易地找到有关此内容的进一步信息(请参见第2.6节有关字符和字符串字面值的内容,特别是charesc的定义)。

然而,通过使用Haskell的元编程系统Template Haskell,您可以创建原始字符串。来自包页面

λ> :set -XQuasiQuotes
λ> import Text.RawString.QQ
λ> let s = [r|\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}|]
λ> s
"\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}"
λ> [r|C:\Windows\SYSTEM|] ++ [r|\user32.dll|]
"C:\\Windows\\SYSTEM\\user32.dll"

同样的,您可以键入上面的字符串:

λ> [r|my string with "double quotes" blablabla|]
"my string with \"double quotes\" blablabla"

请注意,在Haskell源文件中,这需要您在文件顶部使用{-#LANGUAGE QuasiQuotes#-}编译指示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接