gpt4 book ai didi

haskell - 安全复制从字符串迁移到字节串

转载 作者:行者123 更新时间:2023-12-02 16:53:53 25 4
gpt4 key购买 nike

我正在尝试使用 safecopy haskell 库,但是当我尝试将字符串迁移到字节字符串时,最后 4 个字符丢失,并且 4 个“\NULL”字符被添加到字符串前面:

{-# 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

此输出:使用 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:抱歉代码量太大,但我想不出更好的方法来表达问题。

最佳答案

这是因为酸性状态。您在实现之间更改了 getTsetT 的类型,这会弄乱事务日志。如果不首先使用 createCheckpoint 清除事务日志,您基本上无法更改使用 makeAcidic 标记的任何函数。 (使用旧版本的代码库)。

关于haskell - 安全复制从字符串迁移到字节串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30330550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com