Ошибка типа Haskell ByteString

Я впервые использую 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, потому что тогда возникнут конфликты с функциями, определенными в прелюдии для обычных списков. Есть ли у вас какие-либо идеи?


person mastro    schedule 06.02.2015    source источник


Ответы (1)


Компилятор пытается сообщить вам, что вы используете два разных пакета bytestring. Подробности и решение см. здесь: Не удалось сопоставить ожидаемый тип с фактическим типом ошибки при использовании Codec.BMP

person Yuras    schedule 06.02.2015
comment
@Filippo, вам, вероятно, следует кабализировать свой код, чтобы предотвратить такие проблемы. Например, см. wiki.haskell.org/How_to_write_a_Haskell_program. - person Yuras; 06.02.2015
comment
Если сейчас я использую ленивую версию ByteStrings (import qualified Data.ByteString.Lazy as B ), она больше не работает, и я получаю ту же ошибку, что и раньше: Couldn't match type ‘B.ByteString’ with ‘Data.ByteString.Internal.ByteString’ NB: ‘B.ByteString’ is defined in ‘Data.ByteString.Lazy.Internal’ ‘Data.ByteString.Internal.ByteString’ is defined in ‘Data.ByteString.Internal’ - person mastro; 06.02.2015
comment
Это другая ошибка. Это потому, что ленивые и строгие строки байтов не одного типа. Вам нужно конвертировать между ними. Некоторое время назад я написал руководство по байтовым строкам, которое вы, возможно, хочу взглянуть. - person Shaun the Sheep; 06.02.2015
comment
Большое спасибо, это было действительно полезно. Не могу поверить, что люди из FPComplete отвечают на мой глупый вопрос. Большое спасибо еще раз. - person mastro; 06.02.2015
comment
Пожалуйста. Хотя я не человек FPComplete :). Любой может создать учетную запись и публиковать контент. Вы также можете запустить код на месте, щелкнув маленький значок воспроизведения в правом верхнем углу, что приятно. - person Shaun the Sheep; 09.02.2015