gpt4 book ai didi

haskell - 为什么 Haskell (Hugs) 中的 Show 实例会导致堆栈溢出错误?

转载 作者:行者123 更新时间:2023-12-02 11:22:49 25 4
gpt4 key购买 nike

下面是 Haskell 中的多态数据类型,由 Hugs 解释。我正在尝试创建 Show for Equality 的实例。

实例声明表示,如果 Show 中存在类型“a”,则 Show 中等于 a。它应该以“a = b”的形式将两个参数打印到构造函数 Equals a b。

data Equality a = Equals a a 

instance (Show a) => Show (Equality a) where
show (Equals a b) = a ++ " = " ++ b

但是,在 Hugs 中输入诸如“(Equality 9 9)”之类的内容会产生:

错误 - C 堆栈溢出

因此,我尝试将“show (Equals a b)...”行缩进几个空格。我不确定有什么区别,但只是玩了一下,然后得到了这个:

Inferred type is not general enough
*** Expression : show
*** Expected type : Show (Equality a) => Equality a -> String
*** Inferred type : Show (Equality [Char]) => Equality [Char] -> String

任何人都可以解释为什么会发生这些错误,或者建议实现此显示实例的更好方法吗?

谢谢!

最佳答案

您的代码缩进不正确。它定义了一个空的 Show 实例:

instance (Show a) => Show (Equality a) where

和一个单独的顶级函数show:

show (Equals a b) = a ++ " = " ++ b

类型等于[Char] -> [Char]。因此,当您尝试使用 Show 实例时,default definition of show from the Show class被捡起。看代码:

showsPrec _ x s = show x ++ s
show x = showsPrec zeroInt x ""

您可以看到默认的 show 是根据 showsPrec 定义的,而 showsPrec 又是根据 show 定义的。这解释了为什么你的程序会进入无限循环。

要修复代码,请适当缩进,并添加对 show 的缺失调用以修复类型错误(这是由于您无法连接任意类型 a 带有字符串 - 您必须首先将 a 转换为字符串):

data Equality a = Equals a a

instance (Show a) => Show (Equality a) where
show (Equals a b) = show a ++ " = " ++ show b

测试:

*Main> show (Equals 9 9)
"9 = 9"

关于haskell - 为什么 Haskell (Hugs) 中的 Show 实例会导致堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7863176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com