haskell - GHCI 中的不同输出

标签 haskell

使用 M 1 运行此命令将显示一个新行,而 a 将在 ghci 输出中显示字符“\n”。 因为它们是相同的角色,所以我期望有相同的行为。

有什么理由吗?

data V = M Int
instance Show V where
  show m = a

a :: [Char]
a = "\n"

最佳答案

每当在 GHCi 中显示一个值时,它都会使用该对象的 Show 实例,通过应用 show 函数将其转换为人类可读的文本,然后打印结果字符串。就您而言,发生的情况是:

  • 您已将 VShow 实例定义为常量 "\n" 或换行符。因此,当 GHCi 尝试显示 V 类型的值时,它会输出换行符。
  • 相比之下,StringShow 实例的定义方式是,对于任何字符串 sshow 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/

相关文章:

haskell - 提取嵌套 Exception monad 转换器的左值

haskell - 同态中的森林砍伐

haskell - Haskell 中的验证

haskell - 用状态单子(monad)重构不纯递归?

haskell - 简单的 Haskell 程序导致 'Illegal signature in pattern' 错误

haskell - 搜索重写规则

haskell - 打印表达式时最小化括号

haskell |是否重新计算了 let 表达式?

haskell - 对于没有 `otherwise` 子句的 Haskell 函数,模式匹配是非详尽的

haskell - 非负整数