在Haskell中表示带有嵌入式引号的字符串

时间:2018-03-15 11:00:56

标签: string haskell

在自然语言中,在引号内加引号是很常见的,例如:

(1)"这句话不是"句子" "

(2)"'S'在语言L中为真,如果是S"

(2)实际上对任何塔尔斯基的真理定义都很重要(塔斯基认为(2)的每个实例的真实性对于真理定义的充分适当性是必要的)。

其他例子出现在悖论的研究中;着名的是,在Quine's paradox我们被引导考虑(3):

(3)"声明"'在其引用之前产生谎言'在引用之前产生虚假的情况"是假的"

我对如何在Haskell中实现引用中的引用感兴趣。我想知道的是,在Haskell中,如果有适当的技术诀窍,我们可以代表(1) - (3),因为它们是在上面写的,因为它们会出现在书中(即,不以任何方式正交修改),没有收到错误消息。

对(3)的简单类型搜索,:t ("The statement "'yields falsehood when preceded by its quotation' yields falsehood when preceded by its quotation" is false")得出(没有双关语!)

<interactive>:1:18: error:
• Syntax error on 'yields
  Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
• In the Template Haskell quotation 'yields

2 个答案:

答案 0 :(得分:3)

这个答案大部分都会重复评论中的内容(以及你自己的答案),但有一些可能有用的详细说明。

在下文中,我将滥用键盘输入格式,如 case ,当我想谈论字符串时,它确实是。你可以采取&#34;因为它确实是&#34;表示内存中的某个字节序列或更多柏拉图式的东西 - 随意选择您喜欢的本体。重要的是,如果我想在Haskell程序中引用 case ,我需要一些方法来指定我真的在谈论一个字符串,因为Haskell源代码实际上是一串字符串以某种方式解释的字符 - 特别是在解释中case将被视为引入案例陈述的关键字。 Haskell语法采用的解决方案是使用双引号来引入字符串文字,因此"case"表示 case

这一切都很好,但这句话不是&#34;句子&#34; ?问题是Haskell语法没收了字符&#34; ,赋予它特殊含义,这意味着"This sentence is not a "sentence""实际上并不代表这句话是不是&#34;句子&#34; (相反,它代表这句话不是,像函数一样应用于名为sentence的变量和空字符串 - 这几乎总是胡说八道。该问题的解决方案是没收 \ 以便将其用作转义字符,当在字符串文字中使用时,表示应按字面意思取下面的字符,并且不是根据它在Haskell语法中的通常角色(这不是 \ 被用作转义字符的唯一方式,但是不要让我们陷入困境)。就是这样,这句话不是&#34;句子&#34; "This sentence is not a \"sentence\""表示,一切都在世界上。

在评论中经过长时间的讨论后,上述所有内容可能非常明显。但是,有一些有趣的事情需要添加putStrLnshowprint。从putStrLn开始,它的角色可以抽象地描述为在屏幕上绘图,如果你不关心你的普通约束,那么这些东西看起来就像你代表一个字符串一样。 Haskell语法。 putStrLn与假设的cartoonifyStrLn之间没有根本区别,它会在您的桌面上绘制粉红色的Comic Sans字符串,甚至是seeStrLn,这会产生视觉效果。直接在你的视网膜上串。关键是putStrLn "This sentence is not a \"sentence\""表示这句话不是&#34;句子&#34; ,其方式完全在Haskell外部。幸运的是,这个事实是由类型系统表达的:

GHCi> -- Actually a string.
GHCi> :t "This sentence is not a \"sentence\""
"This sentence is not a \"sentence\"" :: [Char]
GHCi> -- Note how there won't be any mention of String (or [Char]).
GHCi> :t putStrLn "This sentence is not a \"sentence\""
putStrLn "This sentence is not a \"sentence\"" :: IO ()

其类型中带有IO的值代表Haskell外部的部分或全部内容。 IO可以引用和利用这些内容,而不会忽略关于它们的这一重要事实。

show函数生成字符串 - 或者更确切地说,String - 表示Haskell值

GHCi> show 99
"99"
GHCi> show (Just 99)
"Just 99"

然而,这是对show所做的不完整的描述。它产生的String应该作为字符串文字表示根据Haskell语法给出的值的有效表示。这就是为什么show String生成一个带有额外引号的字符串...

GHCi> show "case"
"\"case\""

...更不用说所有额外的反斜杠了:

GHCi> show "This sentence is not a \"sentence\""
"\"This sentence is not a \\\"sentence\\\"\""

至于print,只有show后跟putStrLn,所以它往往会对大多数类型做出您期望的...

GHCi> print 99
99
GHCi> print (Just 99)
Just 99

...但不适用于String - 在他们的情况下,您应该只使用putStrLn

GHCi> print "This sentence is not a \"sentence\""
"This sentence is not a \"sentence\""

P.S。:关于技术性的额外阅读可能有趣:How to convert Unicode Escape Sequence to Unicode String in HaskellSemantics of show w.r.t. escape characters

P.P.S。:我欢迎批评我在这个答案中使用引文。

答案 1 :(得分:1)

正如最初在问题下面的评论中暗示的那样,但当时我并不清楚(尽管对其他人来说可能是完全明显的),有一种简单的方式来代表(1) - (3) )上面使用\和putStrLn "This sentence is not a \"sentence\" " This sentence is not a "sentence" putStrLn "\"S\" is true in language L iff S" "S" is true in language L iff S putStrLn "The statement \"'yields falsehood when preceded by its quotation' yields falsehood when preceded by its quotation\" is false" The statement "'yields falsehood when preceded by its quotation' yields falsehood when preceded by its quotation" is false 。我们只需使用以下代码:

broadcastReceiver