如何在Haskell中转义双引号?

时间:2018-10-04 07:43:02

标签: haskell

我知道我们可以使用\"来避开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'

2 个答案:

答案 0 :(得分:12)

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

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

上面的内容在您需要写很多双引号的情况下当然很麻烦。 Haskell启用 quasiquotes 的方式,许多Haskell软件包都使用此方式在Haskell内部开发“迷你语言”。据我所知,在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模板。通常,如果用“香草” Haskell来表达某些内容会花费很多工作,而使用特定语言编写它会更容易。

答案 1 :(得分:10)

使用\"。香草Haskell没有其他方法。例如:

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

关于此的更多信息可以在Haskell 2010 Report中找到(有关字符和字符串文字,请参见§2.6,特别是 charesc 的定义。)。

但是,通过使用模板Haskell(Haskell的元编程系统),可以创建原始字符串。来自the package page

λ> :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 #-}编译指示。