Haskell:更改 ByteString 中给定索引处的元素

Haskell: Changing an element at a given index in a ByteString

我正在尝试将由 ByteString 组成的矩阵中索引 x 和 y 处的字符更改为不同的字符。最初,我使用 [[Char]] 来表示矩阵,因此我能够使用 Control.Lens.Setter 中的 .~ 来更改值,但这似乎不适用于 [ByteString] .

有没有什么方法可以使用镜头或修改元素,而无需像我现在所做的那样 unpacking 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