首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用函数的酸状态safeCopy

使用函数的酸状态safeCopy
EN

Stack Overflow用户
提问于 2012-05-08 13:03:32
回答 1查看 284关注 0票数 4

存在数据类型时的问题:

代码语言:javascript
复制
MyData = One Int | Two (Int -> Int) | Three | Four

问题是当我说

代码语言:javascript
复制
$(deriveSafeCopy 0 'base ''MyData)

我得到了以下错误:

代码语言:javascript
复制
No instance for (SafeCopy (Int -> Int) )
   arising from the use of `getSafePut`
...

所以我意识到SafeCopy可能并不是为函数设计的。

我有麻烦了吗?因为我不能改变MyData的模型...有什么方法可以做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-08 13:08:36

实际上,由于SafeCopy的要点是序列化,所以您不能在数据中使用函数;GHC不支持函数的序列化,由于各种原因,这样做会有问题;函数可能会关闭短暂的数据,如操作系统句柄等,因此很难可靠地序列化和反序列化函数。

您必须以其他方式对其建模;例如,如果只需要从Int -> Int函数中获得一些可能的行为,则可以将其建模为一种数据类型。例如,如果您需要的唯一函数是\x -> x `div` k (对于任意常数k)和\x -> x + 1,您可以这样写:

代码语言:javascript
复制
data IntToInt
    = DivideBy Int
    | PlusOne

它可以是SafeCopy的一个实例。但是如果你依赖于不受限制的函数,那么我担心你将不得不以更基本的方式改变你的设计。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10492812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档