使用函数的acid-state-safeCopy

时间:2012-05-08 05:03:32

标签: haskell acid

存在数据类型时出现问题:

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的模型.... 有没有办法做到这一点?

1 个答案:

答案 0 :(得分:8)

实际上,由于SafeCopy的序列化,你不能在数据中使用函数; GHC不支持函数的序列化,并且出于各种原因这样做会有问题;函数可以关闭诸如操作系统句柄之类的短暂数据,因此很难可靠地序列化和反序列化函数。

你必须以其他方式对其进行建模;例如,如果Int -> Int函数只需要几个可能的行为,则可以将其建模为数据类型。例如,如果您需要的唯一函数是\x -> x `div` k(对于任意常量 k )和\x -> x + 1,您可以写:

data IntToInt
    = DivideBy Int
    | PlusOne

哪个可以SafeCopy的实例。但如果你依赖不受限制的功能,那么我担心你必须以更基本的方式改变你的设计。

相关问题