2015-11-06 74 views
0

我試圖將索引x和y中由ByteString s組成的矩陣中的字符更改爲不同的字符。最初,我使用[[Char]]來表示矩陣,所以我可以使用.~Control.Lens.Setter來更改該值,但這似乎不適用於[ByteString]Haskell:在ByteString中更改給定索引處的元素

有沒有什麼辦法可以像我現在正在做的那樣使用鏡頭或修改元件而不用unpackByteString

的代碼,現在,就是:

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) 

回答

1

這適用於字節串:

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 

需要注意的是字節串是真正的容器Word8值,所以我們需要在這裏使用ASCII碼。

ix運算符適用於很多其他數據結構,如文本,列表,集合,地圖等 - 有關更多詳細信息,請參閱here

+1

您可以使用'fromEnum'''或(with'Data.Char')'ord'''來避免32。 – dfeuer

+0

也就是'fromIntegral。 fromEnum',這真的應該有一個名字。 – dfeuer

相關問題