存在数据类型时的问题:
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的模型...有什么方法可以做到这一点吗?
发布于 2012-05-08 13:08:36
实际上,由于SafeCopy的要点是序列化,所以您不能在数据中使用函数;GHC不支持函数的序列化,由于各种原因,这样做会有问题;函数可能会关闭短暂的数据,如操作系统句柄等,因此很难可靠地序列化和反序列化函数。
您必须以其他方式对其建模;例如,如果只需要从Int -> Int函数中获得一些可能的行为,则可以将其建模为一种数据类型。例如,如果您需要的唯一函数是\x -> x `div` k (对于任意常数k)和\x -> x + 1,您可以这样写:
data IntToInt
= DivideBy Int
| PlusOne它可以是SafeCopy的一个实例。但是如果你依赖于不受限制的函数,那么我担心你将不得不以更基本的方式改变你的设计。
https://stackoverflow.com/questions/10492812
复制相似问题