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,但我没有看到指定的任何地方。我没有找到任何东西与此相关,所以。