[英]Is there a standard function for “do this if Just x”?
我有以下代码:
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库中是否有这样的标准函数? 此外,这可以更通用吗? 我尝试用mb
替换IO ()
但是然后return ()
不起作用。 你如何为任何monad一般写return ()
? (如果可能..)甚至可以将Maybe
推广到这里?
最后,我可以完全doIf
功能吗? 我可以有一个运算符<#>,除非Nothing
?
print <#> Just 3
print <#> Nothing
会输出
3
但我不知道这是否可行。
看看这个功能:
maybe :: b -> (a -> b) -> Maybe a -> b
你几乎把它写在doIf
除了固定的return ()
您的doIf
是Data.Foldable.traverse_
。
你通常可以通过Hoogle找到这种东西,但此刻它似乎有点破碎。 我在系统上安装的命令行版本将Data.Foldable.traverse_
作为查询的第一个结果(a -> IO ()) -> Maybe a -> IO ()
。
当然,您可以定义该运算符,它只是(<#>) = doIf
(或(<#>) = Data.Foldable.traverse_
)。
你可以做的事情是这样的:
main = do
mapM_ print $ catMaybes [Just 3, Nothing, Just 4]
请参阅catMaybes的文档。
(注意:未经测试的代码)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.