有数据类型时出现问题:
MyData = One Int | Two (Int -> Int) | Three | Four
Run Code Online (Sandbox Code Playgroud)
问题是,当我说
$(deriveSafeCopy 0 'base ''MyData)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
No instance for (SafeCopy (Int -> Int) )
arising from the use of `getSafePut`
...
Run Code Online (Sandbox Code Playgroud)
所以我意识到SafeCopy可能不适用于功能......
我有麻烦吗?因为我无法改变MyData的模型....有没有办法做到这一点?
实际上,从SafeCopy序列化的角度来看,你不能在数据中使用函数; GHC不支持函数的序列化,并且出于各种原因这样做会有问题; 函数可以关闭诸如操作系统句柄之类的短暂数据,因此很难可靠地序列化和反序列化函数.
你必须以其他方式建模; 例如,如果您需要从Int -> Int函数中只有一些可能的行为,则可以将其建模为数据类型.例如,如果你需要的唯一函数是\x -> x `div` k(对于任意常数k)\x -> x + 1,你可以写:
data IntToInt
= DivideBy Int
| PlusOne
Run Code Online (Sandbox Code Playgroud)
这可以是一个实例SafeCopy.但如果你依赖不受限制的功能,那么我担心你必须以更基本的方式改变你的设计.