Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell GHCI中的不同输出_Haskell - Fatal编程技术网

Haskell GHCI中的不同输出

Haskell GHCI中的不同输出,haskell,Haskell,使用m1运行此命令将显示新行,a将在ghci输出中显示字符“\n”。 因为他们是同一个角色,我希望他们有同样的行为 有什么原因吗 data V = M Int instance Show V where show m = a a :: [Char] a = "\n" 每当在GHCi中显示某个值时,它都会使用该对象的Show实例,通过应用Show功能将其转换为人类可读的文本,然后打印生成的字符串。在您的情况下,正在发生的是: 您已将V的Show实例定义为常量“\n”,或换行符。因此,当G

使用
m1
运行此命令将显示新行,
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显示
    字符串时,它将获取该字符串(在您的例子中是换行符),使用
    show
    将其转换为具有转义字符的可读格式,然后显示该新字符串

为什么
show
以这种复杂的方式实现字符串?我不太确定,但有一种可能性是消除歧义:
show 1
“1”
,而
show“1”
“1”"
。当打印到控制台时,前者显然是一个数字,而后者显然是一个字符串。

如果您将
实例Show V
定义为
Show m=Show a
,您将得到相同的行为。是的,这是我的问题。它向函数添加了一个Show,但我没有看到指定的任何地方。我没有找到任何东西与此相关,所以。