为什么在 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
在类型声明中使用,但是这个技巧对于检查从文件加载的类型很有用。
为什么在 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
在类型声明中使用,但是这个技巧对于检查从文件加载的类型很有用。
您需要至少实现一个show
或showsPrec
以使实例正常工作。在类中,有show
using showsPrec
(via shows
) 和showsPrec
using的默认实现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
在提示下派生实例。