【发布时间】:2018-03-15 11:00:55
【问题描述】:
在自然语言中,引号内有引号是很常见的,例如:
(1)“这句话不是‘句’”
(2) “‘S’在语言 L iff S 中为真”
(2) 实际上对于任何 Tarski 的真值定义都很重要(Tarski 认为,(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
【问题讨论】:
-
你只需要转义引用,所以
"The statement \"'yields falsehood when preceded by its quotation' yields falsehood when preceded by its quotation\" is false" -
它不是运算符。我认为你解释字符串有点像普通的 Haskell 代码。这是一个字符串文字。字符串文字对一些无法立即添加的字符进行转义:如引号,还有换行符、制表符、unicode 等。
-
@user65526:您可能在字符串的representation 上混淆了strings。事实上,如果我们写
"foo \"bar\" qux"。我们编写了一个 包含 没有反斜杠的字符串,它不包含外引号。如果你打印那个字符串,你会得到foo "bar" qux。关键是字符串文字的 表示 与字符串包含的内容不同。 -
@user65526 stackoverflow.com/questions/19288652/… - 不要对字符串使用 print :) 那么你就不会得到前导/尾随“
-
@user65526 试试
putStrLn "foo \"bar\" qux";将字符串中实际包含的字符呈现给终端。只需在 GHCI 提示符下键入"foo \"bar\" qux"即可使用show来呈现它,这是为了向您显示字符串的表示形式为 Haskell 语法(因此它必须使用反斜杠来转义引号)。print在内部也使用show。