使用函数的acid-state-safeCopy

Ill*_*iax 4 haskell acid

有数据类型时出现问题:

MyData = One Int | Two (Int -> Int) | Three | Four
Run Code Online (Sandbox Code Playgroud)

问题是,当我说

$(deriveSafeCopy 0 'base ''MyData)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

No instance for (SafeCopy (Int -> Int) )
   arising from the use of `getSafePut`
...
Run Code Online (Sandbox Code Playgroud)

所以我意识到SafeCopy可能不适用于功能......

我有麻烦吗?因为我无法改变MyData的模型....有没有办法做到这一点?

ehi*_*ird 8

实际上,从SafeCopy序列化的角度来看,你不能在数据中使用函数; GHC不支持函数的序列化,并且出于各种原因这样做会有问题; 函数可以关闭诸如操作系统句柄之类的短暂数据,因此很难可靠地序列化和反序列化函数.

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

data IntToInt
    = DivideBy Int
    | PlusOne
Run Code Online (Sandbox Code Playgroud)

可以是一个实例SafeCopy.但如果你依赖不受限制的功能,那么我担心你必须以更基本的方式改变你的设计.