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

インスタンスが機能するには、showまたはの少なくとも 1 つを実装する必要があります。showsPrecクラスには、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 に答える