使用酸态 - safeCopy 函数
Posted
技术标签:
【中文标题】使用酸态 - safeCopy 函数【英文标题】:Using acid-state - safeCopy of a function 【发布时间】:2012-05-16 14:15:49 【问题描述】:存在数据类型时的问题:
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】:确实,由于SafeCopy
的重点是序列化,因此您不能在数据中使用函数; GHC不支持函数的序列化,由于各种原因,这样做会有问题;函数可以关闭操作系统句柄等临时数据,因此很难可靠地序列化和反序列化函数。
您必须以其他方式对其进行建模;例如,如果您只需要 Int -> Int
函数的一些可能行为,您可以将其建模为数据类型。例如,如果您需要的唯一函数是\x -> x `div` k
(对于任意常量k)和\x -> x + 1
,您可以编写:
data IntToInt
= DivideBy Int
| PlusOne
其中可以是SafeCopy
的一个实例。但如果你依赖不受限制的函数,那么恐怕你将不得不以更根本的方式改变你的设计。
【讨论】:
感谢您的回答!我使用的可能功能很少,所以我必须将它们设为数据类型......无论如何,这对我来说有点令人震惊,这当然是有道理的,但似乎是唯一的解决方案。再次感谢以上是关于使用酸态 - safeCopy 函数的主要内容,如果未能解决你的问题,请参考以下文章