Ошибка типа при извлечении почтового запроса

Я пытаюсь извлечь основной пост-запрос с помощью кода из этого вопроса (за исключением того, что я использую lbsBackEnd вместо уже не существующих lbsSink).

{-# LANGUAGE OverloadedStrings #-}
import Network.Wai.Handler.Warp (run)
import qualified Data.ByteString.Char8 as C
import Network.Wai.Parse (parseRequestBody, lbsBackEnd)
import Network.Wai(Response(..))
import Network.HTTP.Types(status200)
import Blaze.ByteString.Builder

main = run 3000 app

app req = do
  (params, _) <- parseRequestBody lbsBackEnd req
  let r = C.concat $ map (\(x,y) -> C.concat [x,y]) params
  return $ ResponseBuilder 
      status200
      [("Content-Type", "text/plain")]
      $ fromByteString r

Комментарии в этом вопросе предполагают, что это должно работать, но я получаю ошибку типа

Couldn't match expected type `C.ByteString'
            with actual type `bytestring-0.9.2.1:Data.ByteString.Internal.ByteString'
Expected type: [(C.ByteString, C.ByteString)]
  Actual type: [Network.Wai.Parse.Param]
In the second argument of `map', namely `params'
In the second argument of `($)', namely

Что немного странно, потому что Network.Wai.Parse документы говорят, что Param является синонимом типа (ByteString, ByteString)Насколько я могу судить, это должно работать.

Любые советы о том, что я делаю не так?

1 ответ

Решение

Ваш вай-экстра был построен с использованием bytestring-0.9.2.1, но у вас есть новее bytestring пакет установлен. Если GHC не предписано использовать старую версию с -package флаг или, скрывая более новый, выбирает последнюю установленную версию каждого пакета.

Версия пакета является частью типов, которые она определяет, поэтому ByteString из bytestring-0.9.2.1 не тот же тип, что и ByteString из bytestring-0.10.0.0 (или какой бы ни была ваша последняя версия).

Вы можете

  • скомпилировать программу с -package bytestring-0.9.2.1 флаг (но может быть так, что другие используемые пакеты построены против другого bytestring версия, тогда это не сработает).
  • построить программу как Cabalпакет, затем cabal-install выяснил бы необходимое -package Флаги и предоставить их GHC (если он находит согласованный план сборки).
  • перестраивать wai-extra (и, возможно, много других пакетов) против более новых bytestring версия.
  • отменить регистрацию нового bytestring версия (которая может потребовать пересоздания некоторых пакетов с использованием старой версии).
Другие вопросы по тегам