存在数据类型时出现问题:
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的模型.... 有没有办法做到这一点?
答案 0 :(得分:8)
实际上,由于SafeCopy
的序列化,你不能在数据中使用函数; GHC不支持函数的序列化,并且出于各种原因这样做会有问题;函数可以关闭诸如操作系统句柄之类的短暂数据,因此很难可靠地序列化和反序列化函数。
你必须以其他方式对其进行建模;例如,如果Int -> Int
函数只需要几个可能的行为,则可以将其建模为数据类型。例如,如果您需要的唯一函数是\x -> x `div` k
(对于任意常量 k )和\x -> x + 1
,您可以写:
data IntToInt
= DivideBy Int
| PlusOne
哪个可以是SafeCopy
的实例。但如果你依赖不受限制的功能,那么我担心你必须以更基本的方式改变你的设计。