2016-04-20 30 views
-2

withResponseの3番目の引数の戻り値型を別の関数brReadに使用する予定です。次のコードから関数の戻り引数をHaskellに格納する方法

parse error on input `)' Failed, modules loaded: none.

Network.HTTP.Clientを使用して)::

startOn url = do 
    man <- newManager defaultManagerSettings 
    req <- parseUrl url 
    withResponse req man (let x = return (withResponse req man)) 
    brRead x 
    return $ read 

任意のアイデア私はこのエラーを取得しますか?

+0

は、あなたがより多くのコードを含めてもらえますか?この可能性が最も高い原因は不正なタイプのシグネチャですが、より多くのコードを確認することなく、問題の根源にあるシグネチャを確認することは困難です。 – Jules

+1

それは役に立ちますか? – lamino

+0

これはこの行の 'resp'です - これは' Response BodyReader'(これからいくつかの 'IO a'への関数)を処理する*アクション*であるはずですが、 *あなたは実際に 'content 'を作成しなければならない) - 例えば' content < - withResponse req man(\ resp - > return "What") 'はうまくいくはずだが、 'resonseOpen'か' withResponse'のどちらかが必要です - – Carsten

答えて

2

あなたは混乱しており、これを開梱するには少し時間がかかります。

あなたがIORef Sを使用してIOモナドの内部で作業しているときに、入力パラメータをこっそりする一般的な方法がありますが、私はのでことを伝えるつもりはない:それはないです

  1. withResponseの戻り値は、その3番目のパラメータが返す値なので何もしないでください。
  2. Response BodyReaderwithResponseから外すと、それは閉じられ、あなたはそれを読むことができないので、助けにならないでしょう。

まず第一に、withResponseの種類はこれです:

withResponse :: Request -> Manager -> (Response BodyReader -> IO a) -> IO a 

description of withResponseはそれを明確Response BodyReaderオブジェクトがwithResponseのアクション内部でのみ有効であることになります。したがって、あなたが要求しているようにそのオブジェクトをwithResponseから取り出そうとすると、そのオブジェクトを読むことはできません。 Response BodyReaderオブジェクトは既にクローズされています。

代わりに、応答を使用して何かを実行し、その関数を渡す関数を作成する必要があります。

startOn url = do 
    man <- newManager defaultManagerSettings 
    req <- parseUrl url 
    read <- withResponse req man (brRead . responseBody) 
    return $ read 

あなたに与えられたURLの最初のByteStringチャンクを返すことが、それはすべてあなたです場合:あなたがやりたいことを主張すべてが単一の時間応答で通話brReadで、あなたがこれを行うことができますので、必要、それは大丈夫です。あなたがここでやろうとしていることは、応答の全体ByteStringを返す場合には、すでにそのための便利な機能があります - httpLbs

startOn url = do 
    man <- newManager defaultManagerSettings 
    req <- parseUrl url 
    response <- httpLbs req man 
    return $ responseBody response 
関連する問題