4

データ型がある場合の問題:

MyData = One Int | Two (Int -> Int) | Three | Four

問題は、私が言うときです

$(deriveSafeCopy 0 'base ''MyData)

次のエラーが発生しました:

No instance for (SafeCopy (Int -> Int) )
   arising from the use of `getSafePut`
...

そのため、SafeCopy は機能を意図していない可能性があることを理解しています...

私は困っていますか?私はMyDataのモデルを変更できないので....これを行う方法はありますか?

4

1 に答える 1

8

実際、ポイントSafeCopyはシリアル化であるため、データで関数を使用することはできません。GHC は関数の直列化をサポートしておらず、さまざまな理由でこれを行うには問題があります。関数は、オペレーティング システム ハンドルなどの一時的なデータを閉じることができるため、関数を確実にシリアル化および逆シリアル化することは非常に困難です。

別の方法でモデル化する必要があります。たとえば、Int -> Int関数から必要な動作がわずかしかない場合は、データ型としてモデル化できます。たとえば、必要な関数が\x -> x `div` k(任意の定数k に対して) とのみである場合、次の\x -> x + 1ように記述できます。

data IntToInt
    = DivideBy Int
    | PlusOne

のインスタンスにすることができSafeCopyます。しかし、制限のない機能に依存する場合は、より根本的な方法で設計を変更する必要があります。

于 2012-05-08T05:08:36.037 に答える