Как мне работать с отдельными элементами ByteString в Haskell

Мне нужно написать функцию следующего типа

replaceSubtrie :: SSTrie -> Data.Word.Word8 -> SSTrie -> SSTrie
replaceSubtrie trie base subtrie = ???

где в зависимости от значения base поддерево будет вставлено в дерево разными способами. SSTrie — это мой собственный тип данных, и я знаю, как с ним работать, но понятия не имею, как обращаться со значением Word8.

base — это отдельный «символ» (для определенных значений «символа»), взятый из ByteString. В частности, это результат вызова index для ByteString — это единственная причина, по которой я объявил его Word8.

Я не могу выполнить сопоставление с образцом, так как нет доступного конструктора Word8. И я не могу заставить работать охранников, потому что я не знаю, как создать константу Word8 для сравнения.


[отредактировано] Предложение Джерома сработало. Но в целом, есть ли какие-нибудь хорошие статьи, показывающие, как работать со строками байтов (и другими более низкоуровневыми данными)? Мол, откуда я мог знать этот факт о Word8?


[отредактировано - вопрос для Дона Стюарта]

Прямо сейчас у меня это работает с таким кодом

replaceSubtrie trie 0x41 subtrie = trie{ a=subtrie }

Когда я меняю это на это:

replaceSubtrie trie 'A' subtrie = trie{ a=subtrie }

Я получаю сообщение об ошибке:

Trie.hs:40:21:
Couldn't match expected type `Word8' with actual type `Char'
In the pattern: 'A'
In an equation for `replaceSubtrie':
    replaceSubtrie trie 'A' subtrie = trie {a = subtrie}

У меня есть import qualified Data.ByteString.Char8 as C вверху моего файла. Что я делаю неправильно?


person JonathanZ supports MonicaC    schedule 19.11.2012    source источник
comment
Word8 — это беззнаковое 8-битное значение. Это также Num, Bounded, Eq, Ord... и т. д., так что вы можете рассматривать его от 0 до 255 (hackage.haskell.org/packages/archive/base/4.6.0.0/doc/html/), поэтому вы сможете использовать сопоставление с образцом.   -  person Jerome    schedule 19.11.2012
comment
Спасибо, Джером, это сработало. Я чувствую себя немного глупо, глядя на значение ASCII для «A», но какого черта.   -  person JonathanZ supports MonicaC    schedule 19.11.2012
comment
Также прочитайте haskell.org/haskellwiki/DealingWithBinaryData.   -  person Björn Lindqvist    schedule 19.11.2012


Ответы (1)


Я чувствую себя немного глупо, глядя на значение ASCII для «A», но что, черт возьми,

Вы можете просто импортировать Data.ByteString.Char8 или Data.ByteString.Lazy.Char8, чтобы получить все те же функции, но с возможностью использования символьных литералов в шаблонах.

person Don Stewart    schedule 19.11.2012
comment
Вы можете сделать это, но если вы это сделаете, это, вероятно, запах, что что-то не так. Char8 опасно - person singpolyma; 19.11.2012
comment
Его следует использовать только в качестве удобного средства доступа к двоичным данным. Вот почему я написал это. - person Don Stewart; 19.11.2012
comment
Не могли бы вы уточнить это? Я добавил детали того, что я делаю, к верхнему вопросу (я не совсем уверен, как stackexchange любит структурировать разговоры). - person JonathanZ supports MonicaC; 20.11.2012