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

Ste*_*eve 4 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]
Run Code Online (Sandbox Code Playgroud)

哪个输出:

3
4
Run Code Online (Sandbox Code Playgroud)

换句话说,Just打印Nothing值,但值不会导致任何操作.(并且不要中断计算.)

在Haskell库中是否有这样的标准函数?此外,这可以更通用吗?我试图取代IO ()m b后来return ()不起作用.你如何return ()为任何monad 一般写作?(如果可能..)甚至Maybe可以在这里推广?

最后,我可以完全取消该doIf功能吗?我可以有一个运算符<#>除非Nothing

print <#> Just 3
print <#> Nothing
Run Code Online (Sandbox Code Playgroud)

会输出

3
Run Code Online (Sandbox Code Playgroud)

但我不知道这是否可行.

din*_*ino 17

看看这个功能:

maybe :: b -> (a -> b) -> Maybe a -> b
Run Code Online (Sandbox Code Playgroud)

doIf除了修复之外,你几乎已经写好了return ()


Rei*_*ton 7

doIf是一个特例Data.Foldable.traverse_.

你通常可以通过Hoogle找到这种东西,但此刻它似乎有点破碎.我在系统上安装的命令行版本Data.Foldable.traverse_作为查询的第一个结果(a -> IO ()) -> Maybe a -> IO ().


当然,您可以定义该运算符,它只是(<#>) = doIf(或(<#>) = Data.Foldable.traverse_).


stu*_*ith 5

你可以做的事情是这样的:

main = do
  mapM_ print $ catMaybes [Just 3, Nothing, Just 4]
Run Code Online (Sandbox Code Playgroud)

请参阅catMaybes的文档.

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

  • 我喜欢这种方法.将问题分解为更小的问题,并远离IO更长时间. (3认同)