gpt4 book ai didi

Haskell/Wreq - 关于 http 请求的复杂类型签名的建议

转载 作者:行者123 更新时间:2023-12-04 15:40:06 25 4
gpt4 key购买 nike

我是 Haskell 初学者,目前正在使用 wreq围绕 api 制作一个简单的包装器。我想发送 if-modified-since header (如果提供时间)。我正在以下列方式这样做。

getResponse :: (FormatTime t, Exception e) => File -> Maybe t -> IO (Either e (Response L.ByteString))
getResponse file (Just t) =
let formattedTime = (B.pack . formatTime defaultTimeLocale rfc822DateFormat) t
opts = defaults & header "if-modified-since" .~ [formattedTime]
in try $ getWith opts $ buildUrl file

getResponse file Nothing = try $ (get $ buildUrl file)

我注意到 304 (not modified)响应作为异常(exception)返回,因此这是我使用 Either 的理由类型。我想为可能使用此 api 包装器的人提供对错误的可见性。

假设请求成功,我想将响应正文解析为我的库中定义的相应类型。如果我正在向其发出请求的服务器发生更改,反序列化可能无法正常工作,因此我选择使用 Maybe键入以说明这一点。
getPayload :: FromJSON b => (Either e (Response L.ByteString)) -> Either e (Maybe b)
getPayload (Left _) = return Nothing
getPayload (Right a) = return $ fmap Just (^. responseBody) =<< asJSON a

这些函数的签名对我来说开始看起来很碍眼,我的直觉告诉我有更好的方法,但我不确定。我做的一件事是制作另一个函数将它们放在一起,希望它更容易使用。这是我计划用来创建其他函数以对单个资源提出更具体的请求的函数。
getResource :: (Exception e, FormatTime t, FromJSON b) => File -> Maybe t -> IO (Either e (Maybe b))
getResource f t = getPayload <$> (getResponse f t)

在处理 http 请求时,我现在必须处理 3 层结构。 IO , Either , 和 Maybe .我让这太复杂了吗?从使用和可维护性的角度来看,我能做些什么来减轻工作的痛苦?我该如何改进呢?

最佳答案

这可能不是您想要的,但是 asJSON返回类型为 m (Response a) , 其中 mMonadThrow .而MaybeMonadThrow例如,Either e 也是如此.这意味着您不必使用 Maybe如果 asJSON 出现任何问题,以便处理.您可以“留在”Either单子(monad)代替:

getPayload :: FromJSON b => Either SomeException (Response L.ByteString)
-> Either SomeException b
getPayload = ((fmap (^. responseBody) . asJSON) =<<)

显然,这对左侧的错误类型施加了额外的限制,所以我不确定这是可以接受的。如果没有,请发表评论。

关于Haskell/Wreq - 关于 http 请求的复杂类型签名的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45874798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com