GHC和我还不是朋友。我希望它了解我的返回类型是我的自定义类型。
具体来说,我要确保编译器 实际上,我正在返回OAuth2Response。有没有惯用的方式来实现这一目标?
示例:
data OAuth2Response = Either OAuth2Error OAuth2AccessToken
getAuthorized :: (..) -> (..) -> OAuth2Response
getAuthorized = do
a <- nonceValidation (Returns Left OAuth2Error or Right "")
b <- getAccessToken (Returns Left OAuth2Error or Right OAuth2AccessToken
b
编译器错误消息
• Couldn't match type ‘Either OAuth2Error OAuth2AccessToken’
with ‘OAuth2Response’
答案 0 :(得分:9)
data OAuth2Response = Either OAuth2Error OAuth2AccessToken
我认为此定义没有您认为的那样。特别是,这里的Either
不是指序言中定义的Either
类型构造函数,而是指定义为此声明的一部分。
我想你的意思是
type OAuth2Response = Either OAuth2Error OAuth2AccessToken
即为您感兴趣的特定Either
类型定义类型同义词。
答案 1 :(得分:5)
除了Robin Zigmond所写的内容之外,您还会发现其他要解决的问题,因为b
的类型与您正在使用的do
块中使用的类型不同。解决此问题的一些方法:
“错误”的方式:将b
放回单子中
getAuthorized :: (..) -> (..) -> OAuth2Response
getAuthorized _ _ = do
a <- nonceValidation (Returns Left OAuth2Error or Right "")
b <- getAccessToken (Returns Left OAuth2Error or Right OAuth2AccessToken)
return b
“正确”的方法,首先不要从单子中删除b
。
getAuthorized :: (..) -> (..) -> OAuth2Response
getAuthorized _ _ = do
a <- nonceValidation (Returns Left OAuth2Error or Right "")
getAccessToken (Returns Left OAuth2Error or Right OAuth2AccessToken)