我对Haskell比较陌生,想要表达的概念是一个可能会发生也可能不会发生的IO操作。
Network.URI提供了一个函数来解析URI。
parseURI :: String -> Maybe URI
在我的主函数中,我从用户那里获取输入。
main :: IO ()
main = do
url <- getLine
getResource url
使用parseURI函数。
getResource :: String -> Maybe (IO ())
getResource url = parseURI url >>= doStuff
doStuff :: URI -> Maybe (IO ())
doStuff = undefined
正如您所看到的,我想使用
>>=
来避免处理Maybes时出现级联情况。我已经通过将IO嵌入到Maybe中实现了这一点。我想表达的是可能发生也可能不发生IO操作的情况。我应该使用什么?我肯定不是第一个遇到这个问题的人。我研究过MaybeT和MonadIO,但我不确定那是否是我需要的。
具体来说,如果我将doStuff移动到MaybeT IO ()
,我仍然会被parseURI url :: Maybe String
困住。如果我将其提升到MaybeT,现在我有了MaybeT Maybe String
,这将无法匹配我的doStuff :: MaybeT IO ()
如果可能的话,我希望这看起来更好,并且理解正确的方向和使用的主流工具。
感谢您的时间和建议。
doStuff
可能会返回Nothing
吗?如果不会,那么你可以使用fmap
。 - Aadit M ShahuriAuthority :: Maybe URIAuth
来获取URL的域名时,它可以做一些事情。 - tmpz