将两种数据类型转换为一个持久实体

时间:2015-03-06 23:21:23

标签: haskell

我们使用包装类型对一些数据进行加密签名....

--Here is the base data
data Fridge = Fridge {numOnions::Int, numPickles::Int} deriving (Show)

--Here is the same data, signed
data SignedFridge = SignedFridge {fridge::Fridge, signature::Int}

这样做是为了类型安全(即 - 我错误地提交了无符号Fridge代替签名的代码太多次了......通过这种分割,这个错误在编译时被淘汰了)

现在,我们需要将这些数据(包括签名)存储到数据库中....我希望使用Persistent / Template Haskell,甚至可以移交数据类型生成....但是Fridge中的字段分割/ SignedFridge似乎使这个变得不可能。如果没有签名,那就是

[persistLowerCase|
     Fridge
         numOnions Int
         numPickles Int
         deriving Show
|]

然而,推迟额外的signature项目并保持类型分割是困难的....

三个(坏)选项似乎是

  1. 手动创建PersistEntity实例(呃!)
  2. 使用Persistent / TH创建类似的重复数据类型(如SignedFridge',包含数据和签名),然后创建函数以来回转换为SignedFridge。这有效,但肯定不是DRY。
  3. 丢失类型安全性,将Fridge对象中的签名存储为Maybe Int。当然,直到运行时我都不会发现我不小心使用了未签名的冰箱,我需要签名。
  4. 对我来说,有没有人有第四个更好的选择?

0 个答案:

没有答案