繁体   English   中英

如何在Haskell中删除双引号?

[英]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中,有一些迷你语言可以用莎士比亚语言( hamletluciuscassiusjulius )定义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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM