【发布时间】:2016-04-15 03:50:37
【问题描述】:
我对 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 打交道的 case of 级联。
我已经通过将 IO 嵌入到 Maybe 中来做到这一点。我想表达一个可能发生也可能不会发生的 IO 动作的情况。我应该使用什么?我肯定不是第一个遇到这个问题的人。我研究过 MaybeT 和 MonadIO,但我不确定这是我需要的。
具体来说,如果我将 doStuff 移至 MaybeT IO (),我仍然会使用 parseURI url :: Maybe String。如果我现在将其提升到 MaybeT,我将拥有 MaybeT Maybe String,这与我的 doStuff :: MaybeT IO () 不匹配
我希望它看起来更好(如果可能的话)并了解正确的方向以及使用的主流工具是什么。
感谢您的宝贵时间和建议。
【问题讨论】:
-
doStuff可能返回Nothing吗?如果没有,那么您可以改用fmap。 -
可能它可以,例如在做的事情中我使用
uriAuthority :: Maybe URIAuth来获取 URL 的域
标签: haskell