4

ADT は自由なモナドです:

data Free f r = Free (f (Free f r)) | Pure r

Show作業中に印刷できるように派生させたいと思います。たとえば、次のような場合:

data T next = A next | B next deriving (Show)
aa = Free $ A $ Free $ B $ Pure ()

deriving (Show)現時点では、FreeADTに追加すると次のエラーが発生します。

No instance for (Show (f (Free f r)))
      arising from the first field of ‘Free’ (type ‘f (Free f r)’)
    Possible fix:
      use a standalone 'deriving instance' declaration,
        so you can specify the instance context yourself
    When deriving the instance for (Show (Free f r))

印刷可能な文字列にしたいと思いshow aaます。これは可能ですか?

4

2 に答える 2

2

を回避する代替アプローチとして考えられるものUndecidableInstancesはありますが、あまり広くは適用されませんが、prelude-extrasShow1のクラスを使用することです。これにより適切な制約が得られますが、独自の (単純な) インスタンスを作成する必要があります。(Show1 f, Show r)

于 2015-03-04T00:43:12.743 に答える