无法在 Network.URI 上匹配类型 Maybe 与 not Maybe
Can't match type Maybe vs not Maybe on Network.URI
假设我想解析一个环境变量,如果没有,则默认为 localhost,使用 https://hackage.haskell.org/package/network-2.3/docs/Network-URI.html
我可以这样写一个函数:
parseRabbitURI :: Text -> Maybe URI.URI
parseRabbitURI "" = URI.parseURI "amqp://guest:guest@127.0.0.1/"
parseRabbitURI uri = (URI.parseURI . toS) uri
这很好用。现在假设我想处理错误。我注意到 parseURI returns a Maybe
所以表面上我只需要对其进行模式匹配。所以我创建了一个自定义错误:
data CustomError = MyCustomError Text deriving(Show)
我创建了一个辅助函数:
parsedExtractor
:: MonadError CustomError.MyCustomError m
=> Text
-> Maybe URI.URI
-> m(URI.URI)
parsedExtractor originalString Nothing = throwError $ FlockErrors.FailedToParseURI originalString
parsedExtractor _ (Just uri) = do
pure uri
最后,我修改我的初始函数:
parseRabbitURI :: MonadError CustomError.MyCustomError m => Text -> m(URI.URI)
parseRabbitURI "" = URI.parseURI "amqp://guest:guest@127.0.0.1/" >>= parsedExtractor "amqp://guest:guest@127.0.0.1/"
parseRabbitURI uri = (URI.parseURI . toS) uri >>= parsedExtractor uri
编译失败:
• Couldn't match type ‘URI.URI’ with ‘Maybe URI.URI’
Expected type: URI.URI -> Maybe URI.URI
Actual type: Maybe URI.URI -> Maybe URI.URI
• In the second argument of ‘(>>=)’, namely ‘parsedExtractor uri’
In the expression: (URI.parseURI . toS) uri >>= parsedExtractor uri
In an equation for ‘parseRabbitURI’:
parseRabbitURI uri
= (URI.parseURI . toS) uri >>= parsedExtractor uri
|
23 | parseRabbitURI uri = (URI.parseURI .toS) uri >>= parsedExtractor uri
|
我这辈子都弄不明白为什么。如果初始实现 returns 是 Maybe,为什么它会转换为我无法通过的解包器 URI.URI?
至关重要的是,当我更改 parsedExtractor
上的模式以期待一个字符串时,它 也 无法使用反向消息 (
Couldn't match expected type ‘URI.URI’
with actual type ‘Maybe URI.URI’
我觉得我一定错过了一些完全基本的东西。这是怎么回事?
And for the life of me I can't figure out why. If the initial
implementation returns a Maybe, why is it converting to an unwrapper
URI.URI which I can't then pass?
从Control.Monad引用>>=
的定义,它有类型签名:
(>>=) :: m a -> (a -> m b) -> m b
现在,比较表达式:
(URI.parseURI . toS) uri >>= parsedExtractor uri
我们有:
m a ~ (URI.parseURI . toS) uri
(a -> m b) ~ parsedExtractor uri
由于 (URI.parseURI . toS) uri
return 键入 Maybe URI.URI
并且 Maybe
是 Monad
的实例,所以
m a ~ Maybe URI.URI
和
(a -> m b) ~ (URI.URI -> m b)
和 m b
可以推断为 m (URI.URI)
,因此 >>=
之后的函数(即 parsedExtractor uri
)预期的类型为:
(URI.URI -> m (URI.URI))
但实际并非如此。
假设我想解析一个环境变量,如果没有,则默认为 localhost,使用 https://hackage.haskell.org/package/network-2.3/docs/Network-URI.html
我可以这样写一个函数:
parseRabbitURI :: Text -> Maybe URI.URI
parseRabbitURI "" = URI.parseURI "amqp://guest:guest@127.0.0.1/"
parseRabbitURI uri = (URI.parseURI . toS) uri
这很好用。现在假设我想处理错误。我注意到 parseURI returns a Maybe
所以表面上我只需要对其进行模式匹配。所以我创建了一个自定义错误:
data CustomError = MyCustomError Text deriving(Show)
我创建了一个辅助函数:
parsedExtractor
:: MonadError CustomError.MyCustomError m
=> Text
-> Maybe URI.URI
-> m(URI.URI)
parsedExtractor originalString Nothing = throwError $ FlockErrors.FailedToParseURI originalString
parsedExtractor _ (Just uri) = do
pure uri
最后,我修改我的初始函数:
parseRabbitURI :: MonadError CustomError.MyCustomError m => Text -> m(URI.URI)
parseRabbitURI "" = URI.parseURI "amqp://guest:guest@127.0.0.1/" >>= parsedExtractor "amqp://guest:guest@127.0.0.1/"
parseRabbitURI uri = (URI.parseURI . toS) uri >>= parsedExtractor uri
编译失败:
• Couldn't match type ‘URI.URI’ with ‘Maybe URI.URI’
Expected type: URI.URI -> Maybe URI.URI
Actual type: Maybe URI.URI -> Maybe URI.URI
• In the second argument of ‘(>>=)’, namely ‘parsedExtractor uri’
In the expression: (URI.parseURI . toS) uri >>= parsedExtractor uri
In an equation for ‘parseRabbitURI’:
parseRabbitURI uri
= (URI.parseURI . toS) uri >>= parsedExtractor uri
| 23 | parseRabbitURI uri = (URI.parseURI .toS) uri >>= parsedExtractor uri |
我这辈子都弄不明白为什么。如果初始实现 returns 是 Maybe,为什么它会转换为我无法通过的解包器 URI.URI?
至关重要的是,当我更改 parsedExtractor
上的模式以期待一个字符串时,它 也 无法使用反向消息 (
Couldn't match expected type ‘URI.URI’
with actual type ‘Maybe URI.URI’
我觉得我一定错过了一些完全基本的东西。这是怎么回事?
And for the life of me I can't figure out why. If the initial implementation returns a Maybe, why is it converting to an unwrapper URI.URI which I can't then pass?
从Control.Monad引用>>=
的定义,它有类型签名:
(>>=) :: m a -> (a -> m b) -> m b
现在,比较表达式:
(URI.parseURI . toS) uri >>= parsedExtractor uri
我们有:
m a ~ (URI.parseURI . toS) uri
(a -> m b) ~ parsedExtractor uri
由于 (URI.parseURI . toS) uri
return 键入 Maybe URI.URI
并且 Maybe
是 Monad
的实例,所以
m a ~ Maybe URI.URI
和
(a -> m b) ~ (URI.URI -> m b)
和 m b
可以推断为 m (URI.URI)
,因此 >>=
之后的函数(即 parsedExtractor uri
)预期的类型为:
(URI.URI -> m (URI.URI))
但实际并非如此。