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 回答