0

この質問のコードを使用して、基本的な投稿リクエストを抽出しようとしています(ただしlbsBackEnd、 no-longer-existing の代わりに使用してい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 に指示しない限り、GHC は-package各パッケージの最新のインストール済みバージョンを選択します。

パッケージのバージョンは、それが定義するタイプの一部であるため、ByteStringofはofbytestring-0.9.2.1と同じタイプではありません(または最新バージョンが何であれ)。ByteStringbytestring-0.10.0.0

あなたはできる

  • -package bytestring-0.9.2.1フラグを付けてプログラムをコンパイルします(ただし、使用されている他のパッケージが別のbytestringバージョンに対してビルドされている場合、それは機能しません)。
  • プログラムをCabal化されたパッケージとしてビルドcabal-installし、必要な-packageフラグを見つけ出し、それらを GHC に提供します (一貫したビルド プランが見つかった場合)。
  • 新しいバージョンwai-extraに対して(おそらく他の多くのパッケージを)再構築します。bytestring
  • 新しいバージョンの登録を解除しbytestringます (古いバージョンを使用して一部のパッケージを再構築する必要がある場合があります)。
于 2013-01-13T01:08:40.923 に答える