我试图了解 Haskell 程序如何避免测试“空值”。我正在努力摆脱这个程序中的大小写表达式:
main = do url:outputPath:[] <- getArgs
let maybeUri = parseURI url
case maybeUri of
Just uri -> download uri outputPath
Nothing -> return ()
我非常粗略的理解是,我应该使用 monad 转换器,以便我可以在 IO monad 内的 Maybe 值上使用单个 mappend
,并且“do”语法应该能够支持它。我怎样才能实现这个目标?
最佳答案
使用 Data.Foldable
中的 forM_
,其类型如下:
forM_ :: (Monad m, Foldable t) => t a -> (a -> m b) -> m ()
Maybe
实现了 Foldable
类,其行为类似于包含零个或一个元素的列表,因此当您专门化上述类型中的 t
时签名也许
你会得到:
forM_ :: (Monad m) => Maybe a -> (a -> m b) -> m ()
你可以像这样使用它:
forM_ maybeUri $ \uri -> download uri outputPath
只有当Maybe
值结果是Just
时,它才会运行该操作。
关于haskell - 如何避免在 Haskell 中检查空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794542/