You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:45:41