如何在Haskell中删除双引号?

Man*_*kas 8 haskell

我知道要逃避Haskell中的特殊字符我们可以使用\",所以如果我尝试传递参数:

parseString :: String
parseString = "{\"coord\":[\"D\",\"7\"],\"result\":\"HIT\",\"prev\":{\"coord\":[\"A\",\"10\"],\"result\":null,\"prev\":null}}"
Run Code Online (Sandbox Code Playgroud)

到功能

take 7 parseString
Run Code Online (Sandbox Code Playgroud)

一切正常,但我想知道是否有更短的方法来产生相同的结果,而不是在\"任何地方放置逃避符号(想象大JSON)?

例如,Python有这个:

>>> s = """my string with "double quotes" blablabla"""
'my string with "double quotes" blablabla'
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 12

您使用反斜杠(\"在字符串中)转义双引号,如:

"\"To be, or not to be\" - William Shakespeare"
Run Code Online (Sandbox Code Playgroud)

如果您需要编写大量双引号,上述内容当然会相当麻烦.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|]
Run Code Online (Sandbox Code Playgroud)

因此产生如下字符串:

Prelude Text.RawString.QQ> [r|"To be, or not to be" - William Shakespeare|]
"\"To be, or not to be\" - William Shakespeare"
Run Code Online (Sandbox Code Playgroud)

QuasiQuotes不仅用于生成原始字符串.在耶索德例如有一些小型的语言来定义莎士比亚语言HTML/CSS/JavaScript的模板(hamlet,lucius,cassius,julius).它通常用于在"vanilla"中表达某些东西Haskell需要做很多工作,而用特定语言编写它会使它更容易.

  • 在谈到Yesod和莎士比亚时,为了这个目的,`shakespeare`有`text.Shakespeare.Text`,带有`text`和`stext` quasiquoters. (3认同)

AJF*_*mar 10

使用\".香草Haskell没有别的办法.例如:

?> putStrLn "\""
"
?> putStrLn "my string with \"double quotes\" blablabla"
my string with "double quotes" blablabla
Run Code Online (Sandbox Code Playgroud)

有关这方面的更多信息可以在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"
Run Code Online (Sandbox Code Playgroud)

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

?> [r|my string with "double quotes" blablabla|]
"my string with \"double quotes\" blablabla"
Run Code Online (Sandbox Code Playgroud)

请注意,在Haskell源文件中,这要求您使用{-# LANGUAGE QuasiQuotes #-}文件顶部的pragma.