haskell - 如何避免在 Haskell 中检查空值?

标签 haskell monads option-type

我试图了解 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/

相关文章:

haskell - xmonad:移动新的 float 窗口

haskell - {} in .cabal 用于 Haskell 中的 Haddock 文档

Haskell:在 Monads 中做符号并返回

haskell - 从 IO 而非计算本身获取值(value)

parsing - 秒差距解析许多问题

haskell - 第三类幺半群定律和 IO?

haskell - 如何理解 "m ()"是一元计算

swift - Swift 3.0 中的 UIView?() 构造函数发生了什么?

java - 使用 Optional 验证输入

java - 如何将Optional.isPresent()+Optional.get()重构为Optional.ifPresent()?