GHCI堆栈在`instance Show MyType`上溢出

时间:2013-06-05 11:59:30

标签: haskell stack-overflow typeclass ghci

为什么在GHCI(版本7.6.2)中尝试执行此操作会导致堆栈溢出?如何在GHCI会话期间派生类型类实例或为什么这不可能?

*Main> data T = T Int
*Main> let t = T 42
*Main> instance Show T
*Main> t
*** Exception: stack overflow

我知道我可以在类型声明中使用deriving Show,但这个技巧对于检查从文件加载的类型非常有用。

1 个答案:

答案 0 :(得分:10)

您需要实现showshowsPrec中的至少一个才能使该实例正常工作。在课堂上,show使用showsPrec(通过shows)和showsPrec使用show进行默认实施:

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

shows           =  showsPrec 0

所以

instance Show T

创建一个循环实例。致电show来电showsPrec,呼叫show,其中...... {/ p>

使用StandaloneDeriving语言扩展程序,您可以

ghci> :set -XStandaloneDeriving
ghci> deriving instance Show T

在提示符处派生实例。