[英]How to escape double quotes in 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'
您使用反斜杠(字符串中的\\"
)来转义双引号,例如:
"\"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中,有一些迷你语言可以用莎士比亚语言( hamlet
, lucius
, cassius
, julius
)定义HTML / CSS / JavaScript模板。 它通常用于在“vanilla”中表达某些东西Haskell需要做很多工作,而用特定语言编写它会使它更容易。
使用\\"
。香草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 #-}
pragma。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.