0

我正在尝试使用此问题中的代码提取基本的发布请求(除了我正在使用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),据我所知,这应该有效。

关于我做错了什么的任何提示?

4

1 回答 1

2

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

包版本是它定义的类型的一部分,因此ByteStringofbytestring-0.9.2.1ByteStringof bytestring-0.10.0.0(或您的最新版本)不同。

你可以

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