【发布时间】:2016-12-12 01:29:07
【问题描述】:
我正在试验 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
我从this post 了解到,与 [Char] 或字符串相比,我更喜欢将响应作为 ByteString。我认为 OverloadedStrings 杂注可能会减少这个问题,但相对于我的输出类型似乎没有改变。
该函数运行良好,并且尽职尽责地为 SO 的主页打印出一个简单的 http 响应,但是那个类型签名看起来真的很难看:
getUrl :: IO (Data.ByteString.Lazy.Internal.ByteString)
我不得不说,我从 Internet 示例中很少看到类似的东西(我们比椭圆形 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"
这似乎不健康。我应该如何理解如何正确构建它?
【问题讨论】:
标签: haskell bytestring http-conduit