ByteString.index - это функция, которую вы ищете.
Большинство «контейнерных» типов эмулируют расширенный интерфейс списка;Вы также должны быть осторожны, потому что эта функция index
приведет к сбою программы, если вы передадите ей слишком короткую строку (как и !!
в обычных списках).Лучшая реализация может быть
import Data.ByteString as B
nthByte :: Int -> B.ByteString -> Maybe Word8
nthByte n bs = fst <$> B.uncons (B.drop n bs)
, которая, читая наизнанку, сбрасывает первые n байт (возможно, генерируя пустую строку байтов), а затем пытается отделить первый символ от остаткаи в случае успеха игнорирует остальную часть строки.