使用酸态 - 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 函数的主要内容,如果未能解决你的问题,请参考以下文章

修改 PIN 中的应用指令

IARG_EXPLICIT_MEMORY_EA 应该用于啥?

函数的使用

oracle日期转换函数怎么调优

使用函数的优势在哪些?

函数的基本使用