Что вы, вероятно, хотите, а не государственная Монада, является монадой ST и изменяемыми векторами.
Используйте IO monad для чтения байтов из файла класса.
bytes <- readFile myClassFile
использование runST
запустить расчет ST
монады на данных байтах:
let result = runST $ transform bytes
ЗБ Монада дает вам доступ к mutable vectors, которые много, как C или Java массивы. Они индексируются целыми числами и имеют O (1) поиск и изменение.
transform :: [Char] -> ST s [Char]
transform bytes = do
mvec <- thaw $ fromList bytes
-- you can read a value at an index
val <- read mvec 0
-- and set a value at an index
write mvec 0 (val `xor` 0xff)
-- ...
-- turn it back into a list of bytes
vec <- freeze mvec
return $ toList vec
Так что просто пройти вокруг mvec
для всех функций (которые должны возвращать действие ST), и вы будете в состоянии сделать все, что вы хотите байтов.
Если вы не хотите беспокоиться о передаче его в качестве аргумента, подумайте об использовании преобразования монады ReaderT
, чтобы сделать mvec
неизменно доступным для всего вашего кода.
transform bytes = do
-- ...
runReaderT other mvec
--- ...
other :: ReaderT (MVector s Char) (ST s) String
other = do
-- ...
-- grab the mvec when you need it
mvec <- ask
val <- lift $ read mvec 77
lift $ write mvec 77 (val * 363 - 28)
-- ...
return "Hi!"
Конечно, все это предполагает, что вам необходим произвольный доступ к байтам. Если вы этого не сделаете, то вам, вероятно, не понадобится MVector
.
Например, если все, что вам нужно сделать, это заменить каждый экземпляр 0xDEADBEEF
с 0xCAFEBABE
, вы могли бы просто использовать списки, не требуется ST монады:
let newBytes = intsToBytes . map (\i -> if i == 0xDEADBEEF then 0xCAFEBABE else i) $ bytesToInts bytes
http: // stackoverflow.com/questions/10230562/confusion-over-the-state-monad-code-on-learn-you-a-haskell –
Какие преобразования вы собираетесь делать с байтами? Вы вставляете и удаляете куски? Вам нужен произвольный доступ? Прежде чем беспокоиться о том, какая монада вам нужна, сначала выясните, какая структура данных вам нужна. Это гораздо важнее. – rampion
Кроме того, я предполагаю, что ответы на [этот вопрос] (http://stackoverflow.com/questions/10253474/inject-a-function-into-a-java-class-file-using-haskell) будут использования вам. – rampion