我知道我们可以使用\"
来避开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'
答案 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中,有一些迷你语言可以用莎士比亚语言(hamlet
,lucius
,cassius
,julius
)定义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 #-}
编译指示。