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:抱歉大量的代碼,但我想不出有什麼更好的方式來傳達這個問題。
非常感謝您的回答!我沒有想到這是酸性問題。 – jchmrt