gpt4 book ai didi

haskell - 为什么我的 HTTP 状态类型重叠?

转载 作者:行者123 更新时间:2023-12-02 16:02:55 25 4
gpt4 key购买 nike

我正在使用一些 HTTP 代码,并在构建(使用堆栈构建)时收到编译器警告,该警告在处理不同 HTTP 响应的情况下警告重叠模式匹配。我正在使用这些包

 import Network.HTTP.Types.Status (ok200, status203, Status)
import Network.HTTP.Conduit
import Network.HTTP.Types.Header

有问题的代码是:

 ... -- setup stuff for other functions.
-- getHttpResponse just uses "httpLbs req mngr" with some additional error wrapping
resp <- liftIO $ getHttpResponse mngr req
case resp of
Nothing -> ExceptT $ return $ Left $ create $ "could not get a response from " <> uri
Just r -> case responseStatus r of
ok200 -> do
case decode (responseBody r) of
Nothing -> throwIOError $ "could not decode object from " <> uri
Just xx -> return $ Right (xx, responseStatus r)
status203 -> do
case decode (responseBody r) of
Nothing -> throwIOError $ "could not decode object from " <> uri
Just xx -> return $ Left (xx, responseStatus r)
_ -> (throwIOError $ "non 200 server response "
<> T.pack (show $ responseStatus r)
<> " from " <> uri)

GHC 给我的警告是:

Pattern match(es) are overlapped
In a case alternative:
status203 -> ...
_ -> ...

我的 200 和 203 响应似乎都遵循第一条路线(返回 Right)并与 ok200 匹配。更让我困惑的是,我最初的代码中有一个拼写错误,我用 ok203 代替了 status203。我不知道为什么,但该代码仍然编译并只是给出了类似的警告消息:

Pattern match(es) are overlapped
In a case alternative:
ok203-> ...
_ -> ...

尽管 ok203 没有在我的代码库或我正在使用的任何包中定义(至少我能找到)。

谁能解释一下这里发生了什么?为什么这些模式会重叠?而且,作为奖励,为什么我的代码甚至可以使用 ok203 进行编译?

最佳答案

问题是 ok203status203 是小写的。因此,它们在模式中被解释为要绑定(bind)的变量,而不是要匹配的构造函数。如果不同的状态有单独的构造函数,那么您应该使用它们。否则,您应该使用守卫和 == 来检查状态,而不是尝试匹配它们的值。这可能看起来像

case responseStatus r of
stat
| stat == ok203 -> ...
| stat == ... -> ...
| otherwise -> ...

关于haskell - 为什么我的 HTTP 状态类型重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37303254/

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