使用 M 1
运行此命令将显示一个新行,而 a
将在 ghci 输出中显示字符“\n”。
因为它们是相同的角色,所以我期望有相同的行为。
有什么理由吗?
data V = M Int
instance Show V where
show m = a
a :: [Char]
a = "\n"
最佳答案
每当在 GHCi 中显示一个值时,它都会使用该对象的 Show
实例,通过应用 show
函数将其转换为人类可读的文本,然后打印结果字符串
。就您而言,发生的情况是:
- 您已将
V
的Show
实例定义为常量"\n"
或换行符。因此,当 GHCi 尝试显示V
类型的值时,它会输出换行符。 - 相比之下,
String
的Show
实例的定义方式是,对于任何字符串s
,show s
将输出s
的 Haskell 表示。例如,show "\n"
将给出"\"\\n\"
的结果(即引号、反斜杠、n
,引号)。(尝试在 GHCi 中运行show "myString"
并查看不同字符串的结果,以了解其工作原理。)因此,当 GHCi 显示String
时>,它接受字符串(在您的情况下是换行符),使用show
将其转换为带有转义字符的人类可读格式,然后显示该新字符串。
为什么show
以这种复杂的方式对字符串实现?我不太确定,但一种可能性是消歧: show 1
是 "1"
,但 show "1"
是 “\”1\“”
。当打印到控制台时,前者显然是一个数字,而后者显然是一个字符串。
关于haskell - GHCI 中的不同输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58965469/