2015-05-19 53 views
3

我想使用safecopy haskell庫,但是當我嘗試將字符串遷移到字符串時,最後4個字符將丟失,並且4個字符會被預置爲字符串:Safecopy從字符串遷移到字節串

{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, TypeFamilies #-} 
import Data.SafeCopy 
import Data.Acid 
import Data.Typeable 
import Control.Monad.State.Class 
import Control.Monad.Reader.Class 

data T = T { str :: String } 
     deriving (Show, Typeable) 

getT :: Query T String 
getT = fmap str ask 

setT :: String -> Update T() 
setT str = put $ T str 

deriveSafeCopy 0 'base ''T 

makeAcidic ''T ['setT, 'getT] 

main :: IO() 
main = do 
    state <- openLocalState (T "string set with default") 
    update state (SetT "string set with SetT") 
    str <- query state GetT 
    putStrLn str 

此輸出:string set with SetT,但是當你之後運行以下改性殼聚糖版本:

{-# LANGUAGE TemplateHaskell, DeriveDataTypeable, TypeFamilies #-} 
import Data.SafeCopy 
import Data.Acid 
import Data.Typeable 
import Control.Monad.State.Class 
import Control.Monad.Reader.Class 
import Data.ByteString.Char8 as B 

data T_v0 = T_v0 String 
     deriving (Show, Typeable) 
deriveSafeCopy 0 'base ''T_v0 

data T = T { str :: B.ByteString } 
     deriving (Show, Typeable) 
deriveSafeCopy 1 'extension ''T 

instance Migrate T where 
    type MigrateFrom T = T_v0 
    migrate (T_v0 str) = T $ B.pack str 

getT :: Query T B.ByteString 
getT = fmap str ask 

setT :: B.ByteString -> Update T() 
setT str = put $ T str 
makeAcidic ''T ['setT, 'getT] 

main :: IO() 
main = do 
    state <- openLocalState (T $ B.pack "bytestring set with default") 
    str <- query state GetT 
    print str 

它輸出:"\NUL\NUL\NUL\NULstring set with "。我不知道爲什麼會發生這種情況。我在遷移步驟中做錯了什麼?我儘量保持儘可能接近example code。有誰知道爲什麼會發生這種情況?

P.S:抱歉大量的代碼,但我想不出有什麼更好的方式來傳達這個問題。

回答

0

這是因爲acid-state。您已在更改事務日誌的實現之間更改了getTsetT的類型。如果沒有先用createCheckpoint(使用舊版本的代碼庫)清除事務日誌,則基本上無法更改用makeAcidic標記的任何功能。

+0

非常感謝您的回答!我沒有想到這是酸性問題。 – jchmrt