为什么在 GHCI(7.6.2 版)中尝试执行此操作时会出现堆栈溢出?如何在 GHCI session 期间派生类型类实例,或者为什么这是不可能的?

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

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

最佳答案

您需要至少实现 showshowsPrec 之一才能使实例工作。在类中,有使用 show (通过 showsPrec )的 shows 和使用 showsPrecshow 的默认实现:

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

在提示符下派生实例。

关于haskell - `instance Show MyType` 上的 GHCI 堆栈溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16939386/

10-10 14:27