Haskell-如何将任一类型转换为自定义类型?

时间:2020-09-20 22:21:15

标签: haskell

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’

2 个答案:

答案 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)