如何获取百里香包装的UTCTime数据类型的Binary实例?

时间:2018-08-25 15:18:57

标签: haskell haskell-thyme

我希望能够将CommandRecord序列化为二进制文件以将其保存到文件中。但是我只做的天真的方法是: 由于以下错误,instance Binary CommandRecord无法正常工作。

我可以使用哪种方法来实现上述目标?现在,我的想法是通过放弃使用thyme库和UTCTime的想法来解决此问题,而改为使用time库和UTCTime(具有已定义的Binary实例)。


我具有以下数据类型:

data CommandRecord = CommandRecord {
    command :: Text
  , timedate :: UTCTime
  , path :: Text
  } deriving Generic

我有以下进口商品:

import Data.Thyme.Clock
import Data.Binary
import Data.Binary.Orphans

我正在使用以下软件包:

  • 二进制
  • 二元孤儿
  • 百里香

错误*:

/home/chris/Projects/Haskell/MoscoviumOrange/src/Main.hs:28:10-
29: error:
    • No instance for (Binary UTCTime)
        arising from a use of ‘binary-0.8.5.1:Data.Binary.Class
.$dmput’
      There are instances for similar types:
        instance Binary
                   time-1.8.0.2:Data.Time.Clock.Internal.UTCTim
e.UTCTime
          -- Defined in ‘Data.Binary.Orphans’
    • In the expression:
        binary-0.8.5.1:Data.Binary.Class.$dmput @CommandRecord
      In an equation for ‘put’:
          put = binary-0.8.5.1:Data.Binary.Class.$dmput 
@CommandRecord
      In the instance declaration for ‘Binary CommandRecord’
   |
28 | instance Binary CommandRecord
   |          ^^^^^^^^^^^^^^^^^^^^
/home/chris/Projects/Haskell/MoscoviumOrange/src/Main.hs:28:10-
29: error:
    • No instance for (Binary UTCTime)
        arising from a use of ‘binary-0.8.5.1:Data.Binary.Class
.$dmget’
      There are instances for similar types:
        instance Binary
                   time-1.8.0.2:Data.Time.Clock.Internal.UTCTim
e.UTCTime
          -- Defined in ‘Data.Binary.Orphans’
    • In the expression:
        binary-0.8.5.1:Data.Binary.Class.$dmget @CommandRecord
      In an equation for ‘get’:
          get = binary-0.8.5.1:Data.Binary.Class.$dmget 
@CommandRecord
      In the instance declaration for ‘Binary CommandRecord’
   |
28 | instance Binary CommandRecord
   |          ^^^^^^^^^^^^^^^^^^^^

2 个答案:

答案 0 :(得分:1)

是的,琐碎但缺少的实例问题。我会怎么做:

  1. instance Binary Thyme作为孤立实例添加到您的模块。确认它有效。
  2. 将实例包装在#if !MIN_VERSION_thyme(0,3,6)开关中。原因是,如果出现的新版本thyme也已经包含该实例,则您不希望重复的实例破坏您的构建。
    还请确保您已将依赖项绑定为{{1 }}放在您的thyme<=0.3.5文件中,因此不会尝试该新版本没有的实例。 (这似乎使实例上的切换失效。要点是,您可以在事后编辑关于Hackage的依赖关系范围,并且在出现带有实例的.cabal版本时应该这样做。)
  3. 向添加实例的thyme维护者提出拉取请求。这应该是没有争议的,因为无论如何thyme间接依赖于thyme

仅当您要编写的文件是可执行文件或小型专家库时,才建议这样做。如果这是许多其他项目可能使用的库,则存在与其他人的孤立实例冲突的风险。在这种情况下,您应该改用一种解决方法,直到Binary添加实例为止:

thyme

答案 1 :(得分:0)

跟随@leftaroundabout的1.点,我得到了以下模块:

{-# OPTIONS -Wno-orphans #-}
module ThymeBinaryInstances where

import Data.Binary
import Data.Thyme.Internal.Micro
import Data.Thyme.Clock

instance Binary UTCTime
instance Binary NominalDiffTime
instance Binary Micro