私はhttp-conduitライブラリを試していて、この簡単な例があります:
#!/usr/bin/env stack
{- stack
--resolver lts-7.12
--install-ghc
runghc
--package http-conduit
-}
{-# LANGUAGE OverloadedStrings #-}
import Network.HTTP.Conduit
import Data.ByteString.Lazy.Internal
getUrl :: IO (Data.ByteString.Lazy.Internal.ByteString) ---eeew!
getUrl = do
resp <- simpleHttp "http://www.stackoverflow.com"
return resp
この投稿から、[Char] または String よりも ByteString としての応答を優先する必要があることを理解しています。OverloadedStrings プラグマによってこの問題が軽減される可能性があると想定しましたが、私の out-type に関しては変化していないようです。
この関数は問題なく動作し、SO のホームページに対する単純な http 応答を忠実に出力しますが、その型シグネチャは非常に見苦しく見えます。
getUrl :: IO (Data.ByteString.Lazy.Internal.ByteString)
そして、インターネットの例からそのようなものはほとんど見られないと言わざるを得ません (楕円形の Java インポートよりも多くのドットがあります)。そうですか?応答を返したい場合、HXT、tagsoup、または attoparsec などを使用して解析を開始しますが、これは正しいアプローチまたは型シグネチャですか?
たとえば、別の URL を指定するなど、引数を取る機能を追加し始めると、これはさらに醜くなることに気付きました。
import Network.HTTP.Conduit
import Data.ByteString.Lazy.Internal
-- alright, first arg is now string for my url...
getUrl :: String -> IO (Data.ByteString.Lazy.Internal.ByteString)
getUrl url = do
resp <- simpleHttp url
return resp
main :: IO (ByteString) -- what?! inside the () ?
main = do
getUrl "https://www.stackoverflow.com"
これは不健康に思えます。これを正しく構造化する方法をどのように理解すればよいですか?