我有以下代码:
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 ()
你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]
Run Code Online (Sandbox Code Playgroud)
请参阅catMaybes的文档.
(注意:未经测试的代码)