wreq
を使用してhttpコールを行っていますが、例外をキャッチしてEither
タイプを返したいと思います。私はこのようなことを試しましたが、コールを操作する方法を理解できなかったため、タイプチェックが行われます。`wreq`例外処理の取得/ポスト
-- exhaustive pattern match omitted here
safeGetUrl :: URL -> Maybe Login -> Maybe Password -> IO (Either String (Response LBS.ByteString))
safeGetUrl url (Just login) (Just pass) = do
let def = defaults
opts = def & auth ?~ basicAuth (BS.pack login) (BS.pack pass)
r <- getWith opts url `E.catch` handler
return $ Right r
where
handler :: HttpException -> Either String (Response LBS.ByteString)
handler (StatusCodeException s _ _) = do
return $ Left $ LBS.unpack (s ^. statusMessage)
以下のタイプのエラーを貼り付けていますが、上記のコードはコンパイルされません。問題はr <- getWith opts url
E.catch
handler
です。最初の部分はIO (Res...
を返しますが、例外ハンドラはEither..
を返します。私はをEither
に持ち上げようとしましたが、タイプチェックもしませんでした。
Couldn't match type ‘Either String (Response LBS.ByteString)’
with ‘IO (Response LBS.ByteString)’
Expected type: HttpException -> IO (Response LBS.ByteString)
Actual type: HttpException
-> Either String (Response LBS.ByteString)
In the second argument of ‘catch’, namely ‘handler’
In a stmt of a 'do' block: r <- getWith opts url `catch` handler
IO Either
タイプをこの例外をキャッチし、返却する方法はありますか?
ありがとう:ここ
はコンパイル更新されたバージョンです。私は 'getWith'を「持ち上げ」しようとしていましたが、何とかそれをやる方法を理解できませんでした。私はまだHaskellの初心者の段階にありますので、ただちに '<$>'を使ってどのように応答を包み込むことができないのかを直ちに知ることはできませんでした。 「BSC」対「LBS」については、それはそれを指摘してくれてありがとうございました。 – Ecognium