我有以下代码:
doIf :: (a -> IO ()) -> Maybe a -> IO ()
doIf f x = case x of
Just i -> f i
Nothing -> return ()
main = do
mapM_ (doIf print) [Just 3, Nothing, Just 4]
输出:
3
4
换句话说,会打印Just
值,但Nothing
值不会导致任何操作。 (并且不要中断计算。)
Haskell库中是否有这样的标准函数?此外,这可以更通用吗?我尝试将IO ()
替换为m b
,但后来return ()
无效。你如何为任何monad一般写return ()
? (如果可能..)甚至Maybe
可以在这里推广吗?
最后,我可以完全取消doIf
功能吗?我可以有一个运营商<#>除非Nothing
?
print <#> Just 3
print <#> Nothing
会输出
3
但我不知道这是否可行。
答案 0 :(得分:17)
看看这个功能:
maybe :: b -> (a -> b) -> Maybe a -> b
除了固定的doIf
return ()
中
答案 1 :(得分:7)
您的doIf
是Data.Foldable.traverse_
的特例。
你通常可以通过Hoogle找到这类东西,但此刻似乎有点破碎。我在系统上安装的命令行版本提供Data.Foldable.traverse_
作为查询(a -> IO ()) -> Maybe a -> IO ()
的第一个结果。
当然,您可以定义该运算符,它只是(<#>) = doIf
(或(<#>) = Data.Foldable.traverse_
)。
答案 2 :(得分:5)
你可以按照以下方式做点什么:
main = do
mapM_ print $ catMaybes [Just 3, Nothing, Just 4]
请参阅catMaybes的文档。
(注意:未经测试的代码)