4

为什么在 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在类型声明中使用,但是这个技巧对于检查从文件加载的类型很有用。

4

1 回答 1

10

您需要至少实现一个showshowsPrec以使实例正常工作。在类中,有showusing showsPrec(via shows) 和showsPrecusing的默认实现show

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

shows           =  showsPrec 0

所以

instance Show T

创建一个循环实例。呼叫show呼叫showsPrec,呼叫呼叫,呼叫show……

使用StandaloneDeriving语言扩展,您可以

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

在提示下派生实例。

于 2013-06-05T12:04:05.907 回答