提取发布请求时输入错误

时间:2013-01-13 00:25:27

标签: haskell post typeerror haskell-wai

我正在尝试使用this question中的代码提取基本帖子请求(除了我使用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 个答案:

答案 0 :(得分:2)

您的wai-extra是使用bytestring-0.9.2.1构建的,但您安装了较新的bytestring软件包。除非GHC被指示使用带有-package标志的旧版本或隐藏较新版本,否则它会选择每个软件包的最新安装版本。

包版本是其定义的类型的一部分,因此ByteString的{​​{1}}与bytestring-0.9.2.1的{​​{1}}不同(或者您最新的任何类型)版本是)。

你可以

  • 使用ByteString标志编译程序(但可能是其他使用的软件包是针对不同的bytestring-0.10.0.0版本构建的,那么这将不起作用。)
  • 将程序构建为-package bytestring-0.9.2.1 ized包,然后bytestring将找出必要的Cabal标志并将它们提供给GHC(如果它找到一致的构建计划)。
  • 针对较新的cabal-install版本重建-package(可能还有很多其他软件包)。
  • 取消注册较新的wai-extra版本(可能需要使用旧版本重建某些软件包)。