Haskell:更改 ByteString 中给定索引处的元素
Haskell: Changing an element at a given index in a ByteString
我正在尝试将由 ByteString
组成的矩阵中索引 x 和 y 处的字符更改为不同的字符。最初,我使用 [[Char]]
来表示矩阵,因此我能够使用 Control.Lens.Setter
中的 .~
来更改值,但这似乎不适用于 [ByteString]
.
有没有什么方法可以使用镜头或修改元素,而无需像我现在所做的那样 unpack
ing ByteString
?
现在的代码是:
render :: [[Char]] -> [Loc Int] -> [[Char]]
render maze [] = maze
render maze (Loc (x,y):locs) = render mutate locs
where mutate = element y . element x .~ '*' $ maze
其中 Loc
只是:
newtype Loc a = Loc (a,a) deriving (Show,Eq,Ord)
这适用于 ByteStrings:
import qualified Data.ByteString.Char8 as BS
import Control.Lens
-- change character at position 2 to a space (ASCII code 32)
test = (BS.pack "abcdef") & ix 2 .~ 32
注意 ByteStrings 是真正的 Word8 值的容器,所以我们需要在这里使用 ASCII 码。
ix
运算符适用于许多其他数据结构,如文本、列表、集合、映射等——有关详细信息,请参阅 here。
我正在尝试将由 ByteString
组成的矩阵中索引 x 和 y 处的字符更改为不同的字符。最初,我使用 [[Char]]
来表示矩阵,因此我能够使用 Control.Lens.Setter
中的 .~
来更改值,但这似乎不适用于 [ByteString]
.
有没有什么方法可以使用镜头或修改元素,而无需像我现在所做的那样 unpack
ing ByteString
?
现在的代码是:
render :: [[Char]] -> [Loc Int] -> [[Char]]
render maze [] = maze
render maze (Loc (x,y):locs) = render mutate locs
where mutate = element y . element x .~ '*' $ maze
其中 Loc
只是:
newtype Loc a = Loc (a,a) deriving (Show,Eq,Ord)
这适用于 ByteStrings:
import qualified Data.ByteString.Char8 as BS
import Control.Lens
-- change character at position 2 to a space (ASCII code 32)
test = (BS.pack "abcdef") & ix 2 .~ 32
注意 ByteStrings 是真正的 Word8 值的容器,所以我们需要在这里使用 ASCII 码。
ix
运算符适用于许多其他数据结构,如文本、列表、集合、映射等——有关详细信息,请参阅 here。