Я впервые использую ByteStrings и впервые вижу файл pcap. В основном я пытаюсь эффективно прочитать файл pcap с помощью ByteStrings и вывести его содержимое на экран. Я использую библиотеку Network.Pcap прочитать файл. Вариант ByteString можно найти здесь: Network.Pcap ByteString. Чтобы упростить задачу, я хочу просто напечатать первую строку файла, чтобы мой код выглядел так:
1 import qualified Data.ByteString as B
2 printIt :: PktHdr -> B.ByteString -> IO ()
3 printIt ph bytep = do
4 print $ hdrCaptureLength ph -- not important
5 print $ bytep
6 main = do
7 f <- openOffline "file.pcap"
8 dispatchBS f (1) printIt
где printIt
– это функция callbackBS, которая работает с телом файла.
Компилятор жалуется на это сообщение:
Couldn't match type ‘B.ByteString’
with ‘bytestring-0.10.4.0:Data.ByteString.Internal.ByteString’
NB: ‘B.ByteString’
is defined in ‘Data.ByteString.Internal’
in package ‘bytestring-0.10.4.1’
‘bytestring-0.10.4.0:Data.ByteString.Internal.ByteString’
is defined in ‘Data.ByteString.Internal’
in package ‘bytestring-0.10.4.0’
Expected type: CallbackBS
Actual type: PktHdr -> B.ByteString -> IO ()
In the third argument of ‘dispatchBS’, namely ‘printIt’
In a stmt of a 'do' block: dispatchBS f (1) printIt
Насколько я понимаю, для компилятора функция callbackBS должна иметь тип: PktHdr -> ByteString -> IO ()
, а в строке 2 типы PktHdr ->
B.ByteString -> IO ()
. Однако я не могу просто использовать тип ByteString, потому что тогда возникнут конфликты с функциями, определенными в прелюдии для обычных списков. Есть ли у вас какие-либо идеи?