我对Haskell还是相当陌生,尽管不是编程人员,并且我一直在使用req library执行HTTPS请求。
[为了保留一些通用性,将有两种类型的请求-一种是创建文档(通过HTTP POST),另一种是更新文档(通过HTTP PATCH,使用updateMask
参数中的非空monoid) )。
我可以从updateMask == mempty
是否推断出HTTP动词,但这不会编译,因为POST
和POST
是不同的PATCH
声明(尽管两者都可以作为PATCH
的第一个参数有效) data
的实例。
req
如果我将HttpMethod
或HttpMethod
之一替换为getSaveEventRequestResponse :: Text -> Option Https -> Document -> IO IgnoreResponse
getSaveEventRequestResponse authToken updateMask document =
runReq defaultHttpConfig $
req
(if updateMask == mempty
then POST
else PATCH)
(https "test.example.com" /: "api" /: "projects" /: "myproject")
(ReqBodyJson document)
ignoreResponse $
oAuth2Bearer (encodeUtf8 authToken) <> updateMask
条件,则代码将正确编译。
有没有一种方法可以使编译器允许此条件响应,或者我必须复制此函数,一种使用if
变体,另一种使用POST
?
Edit,以使任何尝试使用相同代码的人受益:
我使用的条件(PATCH
)在这里实际上无效,但这与问题无关。问题在于是否将此条件替换为POST
或PATCH
。
Edit 2关于链接的问题。虽然我现在已经获得了答案,但是看到它有多紧密的联系,这取决于已经考虑了部分应用程序。尽管原理相同,但是引入部分应用程序使Haskell的初学者很难将答案应用于此上下文。
可能的解决方法是使用
updateMask == mempty
这是因为
True
现在,False
和(if updateMask == mempty then req POST else req PATCH) other args here
相等,因为两者均定义为req :: (MonadHttp m, HttpMethod method, HttpBody body,
HttpResponse response,
HttpBodyAllowed (AllowsBody method) (ProvidesBody body))
=> method
-> Url scheme
-> body
-> Proxy response
-> Option scheme
-> m response
。因此,AllowsBody POST
和AllowsBody PATCH
可以共享一个公共类型:
'CanHaveBody
具有相同的类型,它们可以在相同的req POST
的两个分支中使用。