是否有标准功能“如果只是x,请执行此操作”?

时间:2010-12-14 03:03:54

标签: haskell

我有以下代码:

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

但我不知道这是否可行。

3 个答案:

答案 0 :(得分:17)

看看这个功能:

maybe :: b -> (a -> b) -> Maybe a -> b

除了固定的doIf

之外,您几乎已将其写在return ()

答案 1 :(得分:7)

您的doIfData.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的文档。

(注意:未经测试的代码)