我正在试验 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
我从这篇文章中了解到,我应该更喜欢作为 ByteString 的响应而不是 [Char] 或 String。我认为 OverloadedStrings 杂注可能会减少这个问题,但相对于我的输出类型似乎没有改变。
该函数工作正常,并且尽职尽责地为 SO 的主页打印出一个简单的 http 响应,但该类型签名看起来真的很难看:
getUrl :: IO (Data.ByteString.Lazy.Internal.ByteString)
而且我不得不说,我从互联网示例中很少看到类似的东西(我们有比椭圆 Java 导入更多的点,伙计)。那正确吗?如果我想返回一个响应然后开始解析它,比如使用 HXT 或 tagoup 或 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"
这似乎不健康。我应该如何理解如何正确构建它?