HTTP请求错误处理与Haskell代码参数优化问题咨询
问题解答
1. 无法去掉getAge显式参数的原因
你尝试去掉url参数时,大概率是错误写成了:
getAge = getResponseHeader Header.hAge <$> fetchHeaders
这种写法会出现类型不匹配——<$>(即fmap)的右操作数要求是Functor实例(比如IO值),但fetchHeaders的类型是String -> IO (Response ()),它是一个函数,并非IO实例,自然无法直接用<$>组合。
正确的无参数(point-free)写法需要用函数组合符.,把fmap和fetchHeaders结合起来:
import qualified Network.HTTP.Types.Header as Header getAge :: String -> IO [ByteString] getAge = fmap (getResponseHeader Header.hAge) . fetchHeaders
这里fmap (getResponseHeader Header.hAge)会将fetchHeaders返回的IO (Response ())映射为IO [ByteString],再通过.和fetchHeaders组合,最终得到和原getAge完全一致的类型。
2. 捕获请求异常并返回空列表
要处理请求失败的异常,你可以用try函数捕获HttpException,将异常情况统一映射为空列表。首先补充导入相关模块:
import Network.HTTP.Simple import Control.Exception (try) import qualified Network.HTTP.Types.Header as Header
然后修改getAge函数,实现异常捕获与处理:
getAge :: String -> IO [ByteString] getAge url = do result <- try $ fetchHeaders url return $ either (const []) (getResponseHeader Header.hAge) result
也可以写成更简洁的无参数形式:
getAge :: String -> IO [ByteString] getAge = fmap (either (const []) (getResponseHeader Header.hAge)) . try . fetchHeaders
这样无论请求失败(抛出HttpException)还是目标头不存在,都会返回空列表[]。
验证效果
在ghci中执行测试:
ghci> getAge "https://stackoverflow.com" [] ghci> getAge "https://stackoverflow.coms" []
两种场景都会返回预期的空列表。
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

